仅在整词中查找子串?
在Python中,有没有什么优雅的方法可以在一个字符串中查找另一个字符串,但只查找完整的单词,而不是单词的一部分呢?
举个例子,可能会更清楚我想表达的意思:
string1 = "ADDLESHAW GODDARD"
string2 = "ADDLESHAW GODDARD LLP"
assert string_found(string1, string2) # this is True
string1 = "ADVANCE"
string2 = "ADVANCED BUSINESS EQUIPMENT LTD"
assert not string_found(string1, string2) # this should be False
我该如何写一个叫做string_found的函数,来实现我想要的功能呢?我想也许可以用这样的方式来解决:
def string_found(string1, string2):
if string2.find(string1 + " "):
return True
return False
但这样感觉不太优雅,而且如果string1在string2的末尾时也无法匹配。也许我需要用正则表达式?(啊,正则表达式让我害怕)
8 个回答
9
这里有一种方法可以做到这一点,不需要使用正则表达式(正则表达式是一种复杂的文本匹配工具),假设你想要任何空白字符(比如空格、制表符等)都可以作为单词的分隔符。
import string
def find_substring(needle, haystack):
index = haystack.find(needle)
if index == -1:
return False
if index != 0 and haystack[index-1] not in string.whitespace:
return False
L = index + len(needle)
if L < len(haystack) and haystack[L] not in string.whitespace:
return False
return True
还有一些示例代码(codepad是个很棒的主意:感谢Felix Kling提醒我)
17
我认为最简单、最符合Python风格的方法,就是把字符串拆分成一个个单词,然后逐个检查是否有匹配的:
string = "My Name Is Josh"
substring = "Name"
for word in string.split():
if substring == word:
print("Match Found")
另外,这里还有一个一行代码的写法:
any(substring == word for word in string.split())
51
你可以使用正则表达式和一个特殊字符 \b
(我特别标注的):
这个字符可以匹配空字符串,但只在一个单词的开始或结束位置。这里的“单词”是指由字母、数字或下划线组成的一串字符,所以单词的结束是由空格或非字母数字、非下划线的字符来表示的。需要注意的是,
\b
被定义为\w
(字母数字和下划线)和\W
(非字母数字和下划线)之间的边界,因此被认为是字母数字的具体字符集取决于UNICODE
和LOCALE
的设置。在字符范围内,\b
代表的是退格字符,这样做是为了与Python的字符串字面量兼容。
def string_found(string1, string2):
if re.search(r"\b" + re.escape(string1) + r"\b", string2):
return True
return False
如果你认为单词的边界仅仅是空格的话,你也可以在字符串的前后加上空格来处理:
def string_found(string1, string2):
string1 = " " + string1.strip() + " "
string2 = " " + string2.strip() + " "
return string2.find(string1)