回答:
何が問題になっていますか:
if word in mystring:
print 'success'
if 'seek' in 'those who seek shall find':
print('Success!')
ただし、これは一連の文字に一致することに注意してください。必ずしも単語全体ではなく、たとえば'word' in 'swordsmith'
Trueです。単語全体のみを照合する場合は、正規表現を使用する必要があります。
import re
def findWholeWord(w):
return re.compile(r'\b({0})\b'.format(w), flags=re.IGNORECASE).search
findWholeWord('seek')('those who seek shall find') # -> <match object>
findWholeWord('word')('swordsmith') # -> None
単語全体がスペースで区切られた単語のリストに含まれているかどうかを確認する場合は、次のように使用します。
def contains_word(s, w):
return (' ' + w + ' ') in (' ' + s + ' ')
contains_word('the quick brown fox', 'brown') # True
contains_word('the quick brown fox', 'row') # False
このエレガントな方法も最速です。ヒュー・ボスウェルとダソンのアプローチと比較して:
>python -m timeit -s "def contains_word(s, w): return (' ' + w + ' ') in (' ' + s + ' ')" "contains_word('the quick brown fox', 'brown')"
1000000 loops, best of 3: 0.351 usec per loop
>python -m timeit -s "import re" -s "def contains_word(s, w): return re.compile(r'\b({0})\b'.format(w), flags=re.IGNORECASE).search(s)" "contains_word('the quick brown fox', 'brown')"
100000 loops, best of 3: 2.38 usec per loop
>python -m timeit -s "def contains_word(s, w): return s.startswith(w + ' ') or s.endswith(' ' + w) or s.find(' ' + w + ' ') != -1" "contains_word('the quick brown fox', 'brown')"
1000000 loops, best of 3: 1.13 usec per loop
編集: Python 3.6以降のこのアイデアのわずかな変形で、同等に高速です。
def contains_word(s, w):
return f' {w} ' in f' {s} '
contains_word("says", "Simon says: Don't use this answer")
文字列を単語に分割し、結果リストを確認できます。
if word in string.split():
print 'success'
この小さな関数は、指定されたテキスト内のすべての検索語を比較します。すべての検索ワードがテキストで見つかった場合、検索の長さなどを返しますFalse
。
Unicode文字列検索もサポートしています。
def find_words(text, search):
"""Find exact words"""
dText = text.split()
dSearch = search.split()
found_word = 0
for text_word in dText:
for search_word in dSearch:
if search_word == text_word:
found_word += 1
if found_word == len(dSearch):
return lenSearch
else:
return False
使用法:
find_words('çelik güray ankara', 'güray ankara')
文字のシーケンスを照合するだけでは不十分で、単語全体を照合する必要がある場合は、次の簡単な関数を使用して作業を完了できます。基本的に、必要に応じてスペースを追加し、文字列内で検索します。
def smart_find(haystack, needle):
if haystack.startswith(needle+" "):
return True
if haystack.endswith(" "+needle):
return True
if haystack.find(" "+needle+" ") != -1:
return True
return False
これは、カンマやその他の句読点がすでに取り除かれていることを前提としています。
文字列ではなく単語を要求しているので、接頭辞/接尾辞の影響を受けず、大文字と小文字を区別しない解決策を提示したいと思います。
#!/usr/bin/env python
import re
def is_word_in_text(word, text):
"""
Check if a word is in a text.
Parameters
----------
word : str
text : str
Returns
-------
bool : True if word is in text, otherwise False.
Examples
--------
>>> is_word_in_text("Python", "python is awesome.")
True
>>> is_word_in_text("Python", "camelCase is pythonic.")
False
>>> is_word_in_text("Python", "At the end is Python")
True
"""
pattern = r'(^|[^\w]){}([^\w]|$)'.format(word)
pattern = re.compile(pattern, re.IGNORECASE)
matches = re.search(pattern, text)
return bool(matches)
if __name__ == '__main__':
import doctest
doctest.testmod()
単語に正規表現の特殊文字(など+
)が含まれている可能性がある場合は、re.escape(word)
正規表現の使用は解決策ですが、その場合は複雑すぎます。
テキストを単語のリストに分割するだけです。それにはsplit(separator、num)メソッドを使用します。セパレーターをセパレーターとして使用して、文字列内のすべての単語のリストを返します。セパレーターが指定されていない場合、すべての空白で分割されます(オプションで、分割数をnumに制限できます)。
list_of_words = mystring.split()
if word in list_of_words:
print 'success'
これは、コンマなどを含む文字列では機能しません。次に例を示します。
mystring = "One,two and three"
# will split into ["One,two", "and", "three"]
すべてのコンマなどで分割したい場合は、次のように区切り引数を使用します。
# whitespace_chars = " \t\n\r\f" - space, tab, newline, return, formfeed
list_of_words = mystring.split( \t\n\r\f,.;!?'\"()")
if word in list_of_words:
print 'success'
mystring.lower().split()
そしてword.lower()
私はこれが速く正規表現の例よりもあると思います。