2

我想匹配“python”:

re.match("python", "python programming") # --> True

我想排除“python”之后出现空格以外的东西的机会,所以我想:

re.match("python[^ ]", "python3 programming")  # --> False

问题是,如果它只是“python”,我仍然想匹配:

re.match("python[^ ]", "python")               # --> False   (Should be True)

将其设为可选不起作用,因为那时它将匹配前一个案例,而应该返回 false:

re.match("python[^ ]?", "python3 programming") # --> True  (Should be False)
re.match("python[^ ]?", "python")              # --> True

“编程python”的类似情况,其中“python”也应该匹配。

我在这里缺少什么概念以便所有匹配都是正确的?

4

4 回答 4

3

您可以检查单词边界\b

>>> re.search(r"\bpython\b", "python programming") 
<_sre.SRE_Match object at 0xb72be5d0>
>>> print re.search(r"\bpython\b", "python3") 
None
>>> re.search(r"\bpython\b", "programming python") 
<_sre.SRE_Match object at 0xb72be5d0>
于 2013-09-14T14:01:32.930 回答
2

使用否定的前瞻断言

>>> re.search(r"python(?!\S)", "python3 programming")
>>> re.search(r"python(?!\S)", "python")
<_sre.SRE_Match object at 0x000000000298E370>
>>> re.search(r"python(?!\S)", "python ")
<_sre.SRE_Match object at 0x000000000298E3D8>
>>> re.search(r"python(?!\S)", "python!")
>>>

(?!\S)意思是“确保在正则表达式引擎的当前位置之后不能匹配除空格以外的字符”。如果当前位置后面有一个空白字符或没有任何内容,则为 true。

于 2013-09-14T14:00:13.573 回答
0

您可以明确添加特殊情况:

(python[^ ])|(python$)

于 2013-09-14T14:01:35.730 回答
0

[^ ]您实际上排除了空格,而不是其他所有内容。此外,为确保您已完成,您应该包含结束字符串符号。两者结合为您提供:

python( |$)
于 2013-09-14T14:05:54.617 回答