Python正则表达式会产生意外结果

时间:2011-09-21 08:50:14

标签: python regex

我正在尝试创建一个svn预提交挂钩,但无法使我的正则表达式按预期工作。对于看起来不像“DEV-5 | some message”的消息,它应该打印False。为什么我在这里得到真的?

Python 2.7.1+ (r271:86832, Apr 11 2011, 18:05:24) 
[GCC 4.5.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import re
>>> p = re.compile("^\[[A-Z]+-[0-9]+\] | .+$", re.DOTALL)
>>> message = "test message"
>>> match = p.search(message)
>>> bool(match)
True

3 个答案:

答案 0 :(得分:6)

>>> p = re.compile("^[A-Z]+-[0-9]+ \| .+$", re.DOTALL)
>>> print p.search("test message")
None
>>> print p.search("DEV-5 | some message")
<_sre.SRE_Match object at 0x800eb78b8>
  • 您不需要\[\]
  • 您需要逃离|

答案 1 :(得分:4)

罪魁祸首是尾随“|。+ $”,它匹配'message'作为第一个正则表达式的替代。罗马指出你的意思是匹配文字“|”所以你必须把它作为'\ |'来逃避。

要查看匹配的内容,您可以执行以下操作:

print match.group()
' message'

(顺便说一句,更快的非正则表达方式只处理包含竖线的行会使用line.split('|'):

for line in ...:
   parts = line.split('|',1)
   if len(parts)==1: continue
   (code,mesg) = parts

答案 2 :(得分:1)

我没有运行代码,但我怀疑你的正则表达式中备用(|)之后的部分匹配以空格开头的任何非空字符串,在这种情况下它是" message"。< / p>