带有标志的Python re.sub不会替换所有出现的内容

时间:2008-09-03 21:00:34

标签: python regex python-2.x

Python文档说:

  

re.MULTILINE:指定时,模式字符'^'匹配字符串的开头和每行的开头(紧跟在每个换行符之后)...默认情况下,'^'仅在开头匹配字符串......

那么当我得到以下意外结果时会发生什么?

>>> 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.'

3 个答案:

答案 0 :(得分:110)

查看re.sub的定义:

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

第四个参数是计数,你使用re.MULTILINE(即8)作为计数,而不是标志。

如果您希望使用标记,则必须编译正则表达式。

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

在Python 2.7中添加了flags参数,因此完整定义现在是:

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

这意味着:

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

作品。

答案 1 :(得分:10)

re.sub('(?m)^//', '', s)

答案 2 :(得分:7)

re.sub的完整定义是:

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

这意味着如果你告诉Python参数是什么,那么你可以通过flags而不通过count

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

或更简洁:

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