所以,我试图在一个句子中找到一个单词(一个完整的单词)。让我们说句子是
Str1 = "1. how are you doing"
并且我有兴趣找到
Str2 = "1."
就在里面。如果我这样做,
re.search(r"%s\b" % Str2, Str1, re.IGNORECASE)
应该说发现了一场比赛,不是吗?但re.search
对此查询失败。为什么呢?
答案 0 :(得分:6)
这里有两件事是错的:
\b
匹配单词和非单词字符之间的位置,因此匹配任何字母,数字或下划线,以及与该集合不匹配的字符。
您正在尝试匹配.
和空格之间的边界;两者都是非单词字符,\b
锚点永远不会匹配。
您正在递送re
1.
,这意味着'匹配1
和任何其他角色'。您需要使用re.escape()
来匹配字面.
来转义点。
以下效果更好:
re.search(r"%s(?:\s|$)" % re.escape(Str2), Str1, re.IGNORECASE)
现在它将按字面意思匹配您的输入,并查找以下空格或字符串的结尾。 (?:...)
创建一个非捕获组(除非您特别需要捕获匹配的部分,否则总是一个好主意);在小组内部有一个|
管道,可以提供两种选择;匹配\s
(空格)或匹配$
(行尾)。您可以根据需要进行扩展。
演示:
>>> import re
>>> Str1 = "1. how are you doing"
>>> Str2 = "1."
>>> re.search(r"%s(?:\s|$)" % re.escape(Str2), Str1, re.IGNORECASE)
<_sre.SRE_Match object at 0x10457eed0>
>>> _.group(0)
'1. '