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

时间:2016-10-13 23:26:53

标签: python regex parsing svn

我想使用以下正则表达式从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]

我要提取的字符串是:

   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

1 个答案:

答案 0 :(得分:3)

使用原始字符串文字:

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

请参见此固定Python demo

主要问题是您必须将其作为原始字符串文字传递,或使用\\n而不是\n。否则,\n(作为文字换行符)在正则表达式模式中被忽略,被视为格式化空格(请阅读Python re docs中的更多信息)。

另外,请注意,通过用[...](它成为一个字符类部分)将其封闭来破坏前瞻,并且|内部字符类被视为文字管道(因此,在这里,它们应该是去除)。