仅在整词中查找子串?

37 投票
8 回答
62180 浏览
提问于 2025-04-16 06:54

在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(非字母数字和下划线)之间的边界,因此被认为是字母数字的具体字符集取决于UNICODELOCALE的设置。在字符范围内,\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)

撰写回答