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

时间:2010-11-11 13:37:59

标签: python search string 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

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

def string_found(string1, string2):
   if string2.find(string1 + " "):
      return True
   return False

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

8 个答案:

答案 0 :(得分:27)

您可以使用regular expressions和单词边界特殊字符\b(由我突出显示):

  

匹配空字符串,但仅匹配单词的开头或结尾。单词被定义为字母数字或下划线字符的序列,因此单词的结尾由空格或非字母数字,非下划线字符表示。请注意,\b被定义为\w\W之间的边界,因此被视为字母数字的精确字符集取决于UNICODE和{{1}的值标志。在字符范围内,LOCALE表示退格符,以便与Python的字符串文字兼容。

\b

Demo


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

def string_found(string1, string2):
   if re.search(r"\b" + re.escape(string1) + r"\b", string2):
      return True
   return False

答案 1 :(得分:8)

这是一种没有正则表达式(根据请求)的方法,假设您希望任何空格用作单词分隔符。

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

这里有一些demo code(键盘是一个好主意:感谢Felix Kling提醒我)

答案 2 :(得分:1)

我相信,最简单,最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()])

答案 3 :(得分:0)

使用应完成此任务的re或正则表达式模块的一种方法是:

import re

string1 = "pizza pony"
string2 = "who knows what a pizza pony is?"

search_result = re.search(r'\b' + string1 + '\W', string2)

print(search_result.group())

答案 4 :(得分:0)

我正在建立this answer

上述代码的问题在于,在needle中多次出现haystack时,它将返回false,而第二个满足搜索条件的事件却不是第一个。

这是我的版本:

def find_substring(needle, haystack):
  search_start = 0
  while (search_start < len(haystack)):
    index = haystack.find(needle, search_start)
    if index == -1:
      return False
    is_prefix_whitespace = (index == 0 or haystack[index-1] in string.whitespace)
    search_start = index + len(needle)
    is_suffix_whitespace = (search_start == len(haystack) or haystack[search_start] in string.whitespace)
    if (is_prefix_whitespace and is_suffix_whitespace):
      return True
  return False

希望有帮助!

答案 5 :(得分:0)

def string_found(string1,string2):
    if string2 in string1 and string2[string2.index(string1)-1]==" 
    " and string2[string2.index(string1)+len(string1)]==" ":return True
    elif string2.index(string1)+len(string1)==len(string2) and 
    string2[string2.index(string1)-1]==" ":return True
    else:return False

答案 6 :(得分:0)

感谢@Chris Larson 的评论,我测试并更新如下:

import re

string1 = "massage"
string2 = "muscle massage gun"
try:
    re.search(r'\b' + string1 + r'\W', string2).group()
    print("Found word")
except AttributeError as ae:
    print("Not found")

答案 7 :(得分:-1)

打扰一下REGEX研究员,但是简单的答案是:

text = "this is the esquisidiest piece never ever writen"
word = "is"
" {0} ".format(text).lower().count(" {0} ".format(word).lower())

这里的窍门是在要搜索的“文本”和“单词”周围添加两个空格,因此,您可以保证只返回整个单词的计数,并且不会给单词的结尾和开头带来麻烦搜索“文本”。