假设我想在字符串中找到"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.*
来获得预期的结果,但我很想知道为什么星号上的星号无法获得结果。
答案 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
字符串周围的其他字符。