为什么 re.VERBOSE 会阻止我的正则表达式模式工作?

Shu*_*man 5 python regex svn parsing

我想使用以下正则表达式从 svn 日志中获取修改后的文件,它作为单行工作正常,但由于它很复杂,我想使用re.VERBOSE以便我可以向它添加注释,然后它停止工作。我在这里缺少什么?谢谢!

revision='''r123456 | user | 2013-12-22 11:21:41 -0700 (Thu, 22 Dec 2013) | 1 line
Changed paths:
   A /trunk/abc/python/test/module
   A /trunk/abc/python/test/module/__init__.py
   A /trunk/abc/python/test/module/usage.py
   A /trunk/abc/python/test/module/logger.py

copied from test
'''

import re

# doesn't work
print re.search('''
            (?<=Changed\spaths:\n)  
            ((\s{3}[A|M|D]\s.*\n)*)
            [(?=\n)|]       
            ''', revision, re.VERBOSE).groups()

# works
print re.search('(?<=Changed\spaths:\n)((\s{3}[A|M|D]\s.*\n)*)[(?=\n)|]', revision).groups()[0]
Run Code Online (Sandbox Code Playgroud)

我要提取的字符串是:

   A /trunk/abc/python/test/module
   A /trunk/abc/python/test/module/__init__.py
   A /trunk/abc/python/test/module/usage.py
   A /trunk/abc/python/test/module/logger.py
Run Code Online (Sandbox Code Playgroud)

Wik*_*żew 4

使用原始字符串文字:

re.search(r'''
            (?<=Changed\spaths:\n)  
            (?:\s{3}[AMD]\s.*\n)*
            (?=\n)    
            ''', revision, re.VERBOSE)
Run Code Online (Sandbox Code Playgroud)

请参阅这个已修复的Python 演示

主要问题是您必须将其作为原始字符串文字传递,或者\\n使用\n. 否则,\n(作为文字换行符)在正则表达式模式内将被忽略,被视为格式化空白(在Pythonre文档中阅读更多相关信息)。

[...]另外,请注意,您通过将前视(它成为字符类部分)括起来而损坏了前视,并且|内部字符类被视为文字管道(因此,在这里,它们应该被删除)。