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

Python 若组包含换行标志,则正则表达式替换不起作用,python,regex,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.grou

如果我的模式组不包含换行符,\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)
但如果我将模式更改为包含“\n”,则re.sub无法更改内容:

我做错了什么


我使用的是Python 3.4.2

我建议在使用re模块时将regex标志作为命名参数传递。

在代码中,您的标志将被解释为count,因为re模块标志实际上是整数,并且re.DOTALL | re.MULTILINE==16

您的代码应该是这样的:re.MULTILINE对这个特定的正则表达式模式没有影响

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

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

为什么要使用。*\n*:\n*\.*?使用re.DOTALL标志,您可以简单地编写。*:.*或更好的[^::]*:[^]*哪种可能更有效..*\n*:\n**这不匹配\n:。您丢失了:@dhke之前的空格/制表符,事实上,'.'不能错过任何与're.DOTALL'有关的内容,您可以重新编译模式,然后使用pattern.sub,而不是调用re函数。这本可以避免问题,因为不可能将标志与计数混淆,因为标志提供给编译,计数提供给子…不,它不是键,我只使用re.DOTALL进行了检查,结果与我的相同。请再次阅读我的答案。多托并不重要。方法参数是您做错的。flags实际上是一个整数,因此如果您将其作为第四个参数传递,它将被解释为count。我相信您还应该提到,他使用的正则表达式效率很低,而且比它应该使用的更复杂。。。
contents = re.sub(pattern, sub, contents, flags=re.DOTALL)
contents = re.sub(pattern, sub, contents, 0, re.DOTALL)