我的正则表达式出了什么问题?

时间:2010-07-05 00:41:34

标签: python regex

我期待一个字符串不匹配正则表达式,但它是!

>>> re.compile('^P|([LA]E?)$').match('PE').group()
'P'

这似乎是一个错误,因为我认为没有办法让$匹配。另一方面,Python的重写似乎不太可能无法处理这个简单的情况。我在这里错过了什么吗?

顺便说一下,Python在我启动时打印出来:

  

Python 2.5.4(r254:67916,2008年12月23日,15:10:54)[MSC v.1310 32位(英特尔)]在win32上   输入“帮助”,“版权”,“信用”或“许可”以获取更多信息。

5 个答案:

答案 0 :(得分:4)

^P|([LA]E?)$

变为

^P
|
([LA]E?)$

答案 1 :(得分:3)

你写过“P或([LA] E?)”。 “P”匹配。

如果你的意思是锚点适用于这两种情况,那么也许你的意思是:

^(?: P |?([LA] E))$

答案 2 :(得分:2)

另外两点值得一提:使用^re.match()是多余的,如果要匹配字符串的结尾,请使用r "\Z",而不是"$". }

为什么$是邪恶的?假设我们要检查整个字符串s是否匹配某种模式foo。如果模式后面有任何内容,我们不希望将其称为匹配。让我们看看如果模式后面有换行符会发生什么。

>>> import re
>>> s = 'foo\n'
>>> re.match('foo$', s)
<_sre.SRE_Match object at 0x00BAFE90> # match -- FAIL!
>>> re.match('foo\Z', s) # no match -- OK
>>>

以下摘自the docs

$的文档:匹配字符串的结尾或在字符串末尾的换行符之前... 这是使用默认模式,与MULTILINE模式无关。

\Z的文档:仅匹配字符串的末尾。与模式无关,也不受新行的影响。

答案 3 :(得分:1)

它会匹配^P([LA]E)$。你的意思是^(?:P|([LA]E?))$吗?

答案 4 :(得分:0)

它在Mac OS X和Linux上打印相同的输出(Debian测试)。我会惊讶地看到一个错误在三个主要平台上表现相同。此外,'PE'在开头有'P',所以我没有看到匹配正则表达式的问题。同样,'AE'也匹配正则表达式。在Debian和Mac OS X上。