所以,我试图在一个句子中找到一个单词(一个完整的单词)。让我们说这句话是
Str1 = "1. how are you doing"
我有兴趣找到
Str2 = "1."
在里面。如果我做,
re.search(r"%s\b" % Str2, Str1, re.IGNORECASE)
它应该说找到了匹配项,不是吗?但re.search
此查询失败。为什么?
所以,我试图在一个句子中找到一个单词(一个完整的单词)。让我们说这句话是
Str1 = "1. how are you doing"
我有兴趣找到
Str2 = "1."
在里面。如果我做,
re.search(r"%s\b" % Str2, Str1, re.IGNORECASE)
它应该说找到了匹配项,不是吗?但re.search
此查询失败。为什么?
这里有两点不对:
\b
匹配单词和非单词字符之间的位置,因此匹配任何字母、数字或下划线以及与该集合不匹配的字符。
您正在尝试匹配 a.
和空格之间的边界;两者都是非单词字符,并且\b
锚永远不会在那里匹配。
您正在处理re
a 1.
,这意味着“匹配 a1
和任何其他字符”。您需要使用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. '