我期待一个字符串不匹配正则表达式,但它是!
>>> 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上 输入“帮助”,“版权”,“信用”或“许可”以获取更多信息。
答案 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上。