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

标签 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.* 来获得预期的结果,但我很想知道为什么它本身的星号无法获得结果。

最佳答案

您的模式在末尾匹配 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>

您可能需要研究不同类型的 anchor 。 \b 也可能满足您的需求;它匹配单词边界(所以在 \w\W 类字符之间,或者在 \W\w),或者你可以使用否定的前瞻和后视来禁止你的 PATTERN 字符串周围的其他字符。

关于python - 为什么 Python 正则表达式 ".*PATTERN*"匹配 "XXPATTERXX"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30463189/

相关文章:

python - Django 管理多对多子集

python - 在变量中保存对 python 字典(来自 json 文件)项的引用

php - 密码 PHP 的正则表达式

regex - 使用 Perl 正则表达式查找井号 (#)

regex - 使用正则表达式替换字符串中的换行符

python - 我在 Django 应用程序中的同一类的两个对象之间存在 OneToOne 关系。是否有可能加强这种关系的唯一性?

Python:测试检查列表列表中 bool 元素的正确顺序

java - 如何查找字符串中的多个特定子字符串

python - Python 中的一个令人困惑的案例

javascript替换括号内的文本