在字符串中查找子字符串,但仅限于整个单词?

AP2*_*257 20 python string search substring

在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
Run Code Online (Sandbox Code Playgroud)

我怎样才能最好地编写一个名为string_found的函数来完成我需要的工作呢?我想也许我可以用这样的东西来捏造它:

def string_found(string1, string2):
   if string2.find(string1 + " "):
      return True
   return False
Run Code Online (Sandbox Code Playgroud)

但这并不是很优雅,如果它在string2的末尾也不会匹配string1.也许我需要正则表达式?(argh regex fear)

Fel*_*ing 31

您可以使用正则表达式和单词边界特殊字符\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
Run Code Online (Sandbox Code Playgroud)

演示


如果单词边界只是你的空格,你也可以在你的字符串中预先添加空格并附加空格:

def string_found(string1, string2):
   string1 = " " + string1.strip() + " "
   string2 = " " + string2.strip() + " "
   return string2.find(string1)
Run Code Online (Sandbox Code Playgroud)


小智 9

我相信,最简单和最 Pythonic 的方法是将字符串分解为单个单词并扫描匹配项:


    string = "My Name Is Josh"
    substring = "Name"

    for word in string.split():
        if substring == word:
            print("Match Found")

Run Code Online (Sandbox Code Playgroud)

对于奖金,这是一个单线:

any([substring == word for word in string.split()])
Run Code Online (Sandbox Code Playgroud)

  • 真正的一行是 `if word in string.split()` (2认同)

aar*_*ing 7

假设您希望任何空格用作单词分隔符,这是一种在没有正则表达式(根据请求)的情况下执行此操作的方法.

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
Run Code Online (Sandbox Code Playgroud)

这里有一些演示代码(键盘是个好主意:感谢Felix Kling提醒我)

  • 对于那些想要确保标点符号以及空格被认为是有效的全字分隔符的人...修改上面的代码如下:```not in(string.whitespace + string.punctuation)```另请注意这个函数的效率是所提出的RegEx替代方案的两倍以上......如果你经常使用它,这个函数是要走的路. (2认同)