【问题标题】:Why does re.VERBOSE prevent my regex pattern from working?为什么 re.VERBOSE 会阻止我的正则表达式模式工作?
【发布时间】:2017-02-23 06:20:31
【问题描述】:

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

【问题讨论】:

  • 您认为\n 受到了怎样的对待?这是您应该对正则表达式使用原始字符串的原因之一。
  • ideone.com/xlYIMF。主要问题是您必须将其作为原始字符串文字传递。请注意,您通过用[...] 括起来破坏了前瞻(它变成了字符类的一部分)。

标签: python regex parsing svn


【解决方案1】:

使用原始字符串文字:

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

看到这个固定的Python demo

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

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

【讨论】:

  • 我刚刚了解到这一点 :) 如果一组不匹配会怎样?这一切会分崩离析还是只有匹配的人才能返回?
  • @AnoushiravanR 有匹配,或者没有匹配。您只能访问成功匹配的组。
猜你喜欢
  • 1970-01-01
  • 2020-04-02
  • 1970-01-01
  • 1970-01-01
  • 2017-09-04
  • 1970-01-01
  • 2019-10-04
  • 2012-11-17
相关资源
最近更新 更多