2008-09-03 45 views
39
docs

Các Python nói:Python re.sub với một lá cờ không thay thế tất cả các lần xuất hiện

re.MULTILINE: Khi quy định, nhân vật mẫu '^' phù hợp vào lúc bắt đầu của chuỗi và ngay từ đầu của mỗi dòng (ngay sau mỗi dòng mới) ... Theo mặc định, '^' chỉ khớp ở đầu chuỗi ...

Vậy điều gì sẽ xảy ra khi tôi nhận được kết quả không mong muốn sau đây?

>>> import re 
>>> s = """// The quick brown fox. 
... // Jumped over the lazy dog.""" 
>>> re.sub('^//', '', s, re.MULTILINE) 
' The quick brown fox.\n// Jumped over the lazy dog.' 

Trả lời

93

Nhìn vào định nghĩa của re.sub:

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

Đối số thứ 4 là số lượng, bạn đang sử dụng re.MULTILINE (đó là 8) như số lượng, không phải là một lá cờ.

Bạn phải biên dịch regex nếu muốn sử dụng cờ.

re.sub(re.compile('^//', re.MULTILINE), '', s) 

Một lập luận flags đã được bổ sung bằng Python 2.7, vì vậy định nghĩa đầy đủ bây giờ là:

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

Có nghĩa là:

re.sub('^//', '', s, flags=re.MULTILINE) 

công trình.

+6

sẽ tốt hơn nếu bạn có 're.compile ('^ //', re.M) .sub ('', s)' – SilentGhost

+0

bạn không phải biên dịch nó nếu bạn nói với python cờ rằng bạn chuyển nó – pseudosudo

+5

@pseudosudo các đối số cờ đã được thêm vào trong Python 2.7, không tồn tại khi câu trả lời này được đăng. Tôi đã thêm thông tin vào câu trả lời. – agf

5

Định nghĩa đầy đủ của re.sub là:

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

Điều đó có nghĩa rằng nếu bạn nói với Python những gì các thông số, sau đó bạn có thể vượt qua flags mà không đi count:

re.sub('^//', '', s, flags=re.MULTILINE) 

hoặc , chính xác hơn:

re.sub('^//', '', s, flags=re.M) 
+0

Xem nhận xét của tôi và chỉnh sửa câu trả lời khác. – agf

+1

@agf Ah, tôi không nghĩ đến việc xem ngày tháng. – pseudosudo

Các vấn đề liên quan