为什么Python正则表达式"。* PATTERN *"匹配" XXPATTERXX"?

时间:2015-05-26 15:46:03

标签: python regex

假设我想在字符串中找到"PATTERN",其中"PATTERN"可以在字符串中的任何位置。我的第一次尝试是*PATTERN*,但这会产生一个错误,说有没有什么可以重复",我可以接受,所以我尝试了.*PATTERN*。然而,这个正则表达式没有给出预期的结果,见下文

import re
p = re.compile(".*PATTERN*")
s = "XXPATTERXX"
if p.match(s):
    print s + " match with '.*PATTERN*'"

结果是

XXPATTERXX match with '.*PATTERN*'

为什么"PATTER"匹配?

注意:我知道我可以使用.*PATTERN.*来获得预期的结果,但我很想知道为什么星号上的星号无法获得结果。

1 个答案:

答案 0 :(得分:9)

您的模式最后匹配0个或更多N个字符,但没有说明N个字符后面的内容。

您可以将$添加到模式以锚定到输入字符串的末尾以禁止XX

>>> import re
>>> re.compile(".*PATTERN*$")
<_sre.SRE_Pattern object at 0x10029fb90>
>>> import re
>>> p = re.compile(".*PATTERN*$")
>>> p.match("XXPATTERXX") is None
True
>>> p.match("XXPATTER") is None
False
>>> p.match("XXPATTER")
<_sre.SRE_Match object at 0x1004627e8>

您可能想要查看不同类型的锚点。 \b也可能符合您的需求;它匹配单词边界(所以在\w\W类字符之间,或\W\w之间,或者你可以使用负面预测和后视禁止PATTERN字符串周围的其他字符。