如果我的模式组不包含换行符(\n),则一切正常:

contents = b'''
xdlg::xdlg(x_app* pApp, CWnd* pParent)
    : customized_dlg((UINT)0, pParent, pApp)
'''
pattern = rb'(\w+)(::)(\1)'
res = re.search(pattern, contents, re.DOTALL | re.MULTILINE)
if None != res:
    print(res.groups()) # output is: (b'xdlg', b'::', b'xdlg')
sub = rb"\1--\2--\1"
contents = re.sub(pattern, sub, contents, re.DOTALL | re.MULTILINE)
print(contents) # output is b'\nxdlg--::--xdlg...(to save space, unchanged string is ignored)

但如果我将pattern更改为包含'\n're.sub将无法更改contents
pattern = rb'(\w+)(::)(\1)(.*\n*:\n*.*)(\(UINT\)0)'
res = re.search(pattern, contents, re.DOTALL | re.MULTILINE)
if None != res:
    print(res.groups()) # output is (b'xdlg', b'::', b'xdlg', b'(x_app* pApp, CWnd* pParent)\n\t: customized_dlg(', b'(UINT)0')
sub = rb"\1--\2--\1"
contents = re.sub(pattern, sub, contents, re.DOTALL | re.MULTILINE)
print(contents) # the output doesn't change anything!

我在这里做错什么了?
(我使用的是Python3.4.2)

最佳答案

我建议在使用re模块时将regex标志作为命名参数传递。
Here's the sub() method signature from the docs

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

在代码中,您的“标志”将被解释为count,因为re-module标志实际上是整数并且re.DOTALL | re.MULTILINE == 16
您的代码应该是这样的:(re.MULTILINE对这个特定的regex模式没有影响)
contents = re.sub(pattern, sub, contents, flags=re.DOTALL)

如果不使用命名参数,则还需要传入count0表示将替换所有实例。
contents = re.sub(pattern, sub, contents, 0, re.DOTALL)

关于python - 如果组包含换行标记,则正则表达式替换不起作用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31367179/

10-15 12:43