如果组包含换行标志,则正则表达式替换不起作用

时间:2015-07-12 11:15:54

标签: python regex

如果我的模式组不包含换行符(\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!

我在这里做错了什么?

(我使用的是Python 3.4.2)

1 个答案:

答案 0 :(得分:4)

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

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

在你的代码中,你的“flags”将被解释为count,因为re模块标志实际上是整数和re.DOTALL | re.MULTILINE == 16

您的代码应为:(re.MULTILINE对此特定正则表达式模式无效)

contents = re.sub(pattern, sub, contents, flags=re.DOTALL)

如果您不使用命名参数,则还需要传入count0表示将替换所有实例。

contents = re.sub(pattern, sub, contents, 0, re.DOTALL)