web-dev-qa-db-ja.com

文字列内の部分文字列を検索しますが、単語全体の場合のみですか?

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正規表現の恐怖)

20
AP257

正規表現 と単語境界の特殊文字\b(私が強調表示)を使用できます。

空の文字列に一致しますが、Wordの最初または最後にのみ一致します。単語は英数字またはアンダースコア文字のシーケンスとして定義されるため、単語の終わりは空白または英数字以外のアンダースコア文字で示されます。 )。 \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

デモ


Wordの境界が空白だけの場合は、文字列に空白を事前に追加したり追加したりすることもできます。

def string_found(string1, string2):
   string1 = " " + string1.strip() + " "
   string2 = " " + string2.strip() + " "
   return string2.find(string1)
30
Felix Kling

空白をWordの区切り文字として機能させることを前提として、(要求に応じて)正規表現なしでこれを行う方法を次に示します。

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

そしてここにいくつかあります デモコード (コードパッドは素晴らしいアイデアです:私に思い出させてくれたFelixKlingに感謝します)

7
aaronasterling

最も単純で最も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()])
2
user10891956
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
0
SOLOSNAKE231

私は構築しています この答え

上記のコードの問題は、needlehaystackが複数出現し、2番目の出現が検索条件を満たすが、最初の出現は満たさない場合に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

お役に立てば幸いです。

0
TCSGrad

このタスクを実行する必要があるreまたは正規表現モジュールを使用する1つのアプローチは、次のとおりです。

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())
0
Chris Larson