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

cdl*_*ary 57 python regex

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.'
Run Code Online (Sandbox Code Playgroud)

Moe*_*Moe 117

看看定义re.sub:

re.sub(pattern, repl, string[, count, flags])
Run Code Online (Sandbox Code Playgroud)

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

如果你想使用标志,你必须编译你的正则表达式.

re.sub('^//', '', s, flags=re.MULTILINE)
Run Code Online (Sandbox Code Playgroud)

re.sub在Python 2.7中添加了一个参数,因此完整定义现在是:

re.sub(re.compile('^//', re.MULTILINE), '', s)
Run Code Online (Sandbox Code Playgroud)

意思就是:

re.sub(pattern, repl, string[, count, flags])
Run Code Online (Sandbox Code Playgroud)

作品.

  • 最好有`re.compile('^ //',re.M).sub('',s)` (7认同)
  • @pseudosudo在Python 2.7中添加了flags参数,当发布此答案时,这些参数不存在.我已将信息添加到答案中. (5认同)

pse*_*udo 7

完整的定义re.sub是:

re.sub(pattern, repl, string[, count, flags])
Run Code Online (Sandbox Code Playgroud)

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

re.sub('^//', '', s, flags=re.MULTILINE)
Run Code Online (Sandbox Code Playgroud)

或者,更简洁地说:

re.sub('^//', '', s, flags=re.M)
Run Code Online (Sandbox Code Playgroud)

  • @agf 啊,我没想到看日期。 (2认同)