我想使用以下正则表达式从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
答案 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中的更多信息)。
另外,请注意,通过用[...]
(它成为一个字符类部分)将其封闭来破坏前瞻,并且|
内部字符类被视为文字管道(因此,在这里,它们应该是去除)。