2012-01-11 34 views
22

Từ pydoc:Tại sao không IgnoreCase cờ làm việc (re.I) trong re.sub()

re.sub = tiểu (mô hình, repl, chuỗi, đếm = 0, cờ = 0)
Trả lại chuỗi thu được bằng cách thay thế số tận cùng bên trái các lần xuất hiện không trùng lặp của mẫu bằng chuỗi thay thế thay thế . repl có thể là chuỗi hoặc có thể gọi được; nếu một chuỗi, dấu gạch chéo ngược thoát trong nó được xử lý. Nếu nó là một cuộc gọi, nó đã chuyển đối tượng đối sánh và phải trả lại một chuỗi thay thế sẽ được sử dụng.

mã ví dụ:

import re 
print re.sub('class', 'function', 'Class object', re.I) 

Không thay thế được thực hiện, trừ khi tôi thay đổi mô hình để 'Class'.

Tài liệu không đề cập đến bất kỳ điều gì về giới hạn này, vì vậy tôi cho rằng tôi có thể đang làm điều gì đó sai.

Trường hợp ở đây là gì?

Trả lời

43

Dường như với tôi rằng bạn nên làm:

import re 
print re.sub('class', 'function', 'Class object', flags=re.I) 

Nếu không có này, lập luận re.I được chuyển cho đối số count.

+0

Ah, bạn là đúng. Tôi đã bỏ lỡ yêu cầu đối số. Tôi đã sử dụng để đặt cờ sau khi đối tượng chuỗi, như trong chính lại. chức năng, vì vậy tôi không chú ý quá nhiều đến các cuộc gọi đối số. Cảm ơn – theta

7

Đối số flagsthứ năm một - bạn đang đi qua giá trị của re.I như count luận (một sai lầm dễ dàng để làm).

3

Lưu ý đối với những người vẫn xử lý cài đặt Python 2.6.x trở lên. Python documentation for 2.6 re nói:

re.sub(pattern, repl, string[, count]) 

re.compile(pattern[, flags]) 

Điều này có nghĩa là bạn không thể chuyển cờ trực tiếp tới phụ. Chúng chỉ có thể được sử dụng với biên dịch:

regex = re.compile('class', re.I) 
regex.sub("function", "Class object") 
0

Chỉ để thêm vào câu trả lời của Seppo. Theo số http://docs.python.org/2.6/library/re.html, vẫn có cách chuyển cờ trực tiếp sang 'phụ' trong 2.6, điều này có thể hữu ích nếu bạn phải tạo mã 2.7 với rất nhiều phụ tương thích với 2.6. Để trích dẫn hướng dẫn sử dụng:

... nếu bạn cần chỉ định cờ biểu thức chính quy, bạn phải sử dụng đối tượng RE hoặc sử dụng công cụ sửa đổi được nhúng trong mẫu; ví dụ, tiểu ("(? i) b +", "x", "bbbb BBBB") trả về 'xx'

(iLmsux?) (Một hoặc nhiều thư từ đặt 'i', 'L', 'm', 's', 'u', 'x'.) Nhóm khớp với chuỗi trống; các chữ cái đặt cờ tương ứng: re.I (bỏ qua trường hợp), re.L (phụ thuộc vào địa phương), re.M (nhiều dòng), re.S (dấu chấm tất cả), re.U (Unicode phụ thuộc), và re.X (tiết), cho toàn bộ cụm từ thông dụng. (Các cờ được mô tả trong Nội dung mô-đun.) Điều này rất hữu ích nếu bạn muốn bao gồm các cờ như là một phần của biểu thức chính quy, thay vì truyền một đối số cờ tới hàm re.compile().

Trong thực tế, điều này có nghĩa

print re.sub("class", "function", "Class object", flags= re.IGNORECASE)

thể được viết lại bằng bộ sửa đổi (? Ms) như

print re.sub("(?i)class", "function", "Class object")

1

Để tránh những sai lầm của loại hình này, vá khỉ sau có thể được sử dụng:

import re 
re.sub = lambda pattern, repl, string, *, count=0, flags=0, _fun=re.sub: \ 
    _fun(pattern, repl, string, count=count, flags=flags) 

(* là cấm chỉ định count, flags làm đối số vị trí. _fun=re.sub là sử dụng việc kê khai thời gian re.sub)

Demo:.

$ python 
Python 3.4.2 (default, Oct 8 2014, 10:45:20) 
[GCC 4.9.1] on linux 
Type "help", "copyright", "credits" or "license" for more information. 
>>> import re 
>>> re.sub(r'\b or \b', ',', 'or x', re.X) 
'or x' # ?! 
>>> re.sub = lambda pattern, repl, string, *, count=0, flags=0, _fun=re.sub: \ 
...  _fun(pattern, repl, string, count=count, flags=flags) 
>>> re.sub(r'\b or \b', ',', 'or x', re.X) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: <lambda>() takes 3 positional arguments but 4 were given 
>>> re.sub(r'\b or \b', ',', 'or x', flags=re.X) 
', x' 
>>> 
Các vấn đề liên quan