Python-Wordが文字列内にあるかどうかを確認する


177

私はPython v2を使用しており、単語が文字列に含まれているかどうかを確認できるかどうかを調べています。

単語が文字列内にあるかどうかの識別に関するいくつかの情報を見つけました-.findを使用していますが、IFステートメントを実行する方法はあります。次のようなものが欲しいです:

if string.find(word):
    print 'success'

助けてくれてありがとう。

回答:


349

何が問題になっていますか:

if word in mystring: 
   print 'success'

103
注意として、「paratyphoid is bad」という文字列があり、「paratyphoid is bad」に「typhoid」がある場合、trueが得られます。
David Nelson、

3
誰もがこの問題を克服する方法を知っていますか?
user2567857 2014

4
@ user2567857、正規表現-Hugh Bothwellの回答を参照してください。
Mark Rajcok 2014

4
if(mystringのword1およびmystringのword2)
louie mcconnell

2
これはどのように受け入れられた答えですか?!! 文字列に(単語ではなく)文字のシーケンスが表示されるかどうかを確認するだけです
pedram bashiri

168
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

3
各単語を通過するforループを構築する必要なしに、数千の単語のセットなど、複数の単語を検索する本当に高速な方法はありますか?私は100万の文と、どの文にどの一致する単語があるかを調べるために検索する100万の用語があります。現在、処理に数日かかっています。もっと速い方法があるかどうか知りたいです。
トム

@Tomはpython正規表現の代わりにgrepを使用しようとしています
El

swordsmithのp1
Robino 2017

文字列に単語が見つからない場合など、例外をどのように処理しますか?
FaCoffee

1
@FaCoffee:文字列が見つからない場合、関数はNoneを返します(上記の最後の例を参照)。
ヒューボスウェル

48

単語全体がスペースで区切られた単語のリストに含まれているかどうかを確認する場合は、次のように使用します。

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} '

3
これは私のお気に入りの回答です:)
IanS

...ん、私は同意するが、最速の解決策は、(re.compileのようなケースを無視しません。
マイケル・スミス

7
これにはいくつかの問題があります:(1)終わりの言葉(2)最初の言葉(3)間にある言葉contains_word("says", "Simon says: Don't use this answer")
Martin Thoma

@MartinThoma-述べたように、このメソッドは特に、「単語全体がスペースで区切られた単語のリストにあるかどうか」を調べるためのものです。そのような状況では、次の場合にうまく機能します。(1)末尾の単語(2)先頭の単語(3)その間の単語。単語のリストにコロンが含まれているため、この例は失敗します。
user200783 2017

1
@JeffHeaton繰り返しますが、このメソッドは特に、「単語全体がスペースで区切られた単語のリストにあるかどうかを確認したい場合」に特に役立ちます。
ビットウィッチ

17

findは、検索項目が見つかった場所のインデックスを表す整数を返します。見つからない場合は、-1を返します。

haystack = 'asdf'

haystack.find('a') # result: 0
haystack.find('s') # result: 1
haystack.find('g') # result: -1

if haystack.find(needle) >= 0:
  print 'Needle found.'
else:
  print 'Needle not found.'

13

文字列を単語に分割し、結果リストを確認できます。

if word in string.split():
    print 'success'

3
編集リンクを使用して、このコードがどのように機能するかを説明してください。説明は将来の読者に役立つ可能性が高いので、コードを提供するだけではありません。
Jed Fox

1
これは、単語全体を照合するための実際の答えになるはずです。
Kaushik NP 2017

10

この小さな関数は、指定されたテキスト内のすべての検索語を比較します。すべての検索ワードがテキストで見つかった場合、検索の長さなどを返します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')

8

文字のシーケンスを照合するだけでは不十分で、単語全体を照合する必要がある場合は、次の簡単な関数を使用して作業を完了できます。基本的に、必要に応じてスペースを追加し、文字列内で検索します。

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

これは、カンマやその他の句読点がすでに取り除かれていることを前提としています。


トークン化されたスペースで区切られた文字列を使用しているので、このソリューションは私の場合に最適に機能しました。
Avijit 2016年

4

文字列ではなく単語を要求しているので、接頭辞/接尾辞の影響を受けず、大文字と小文字を区別しない解決策を提示したいと思います。

#!/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)


3

長い文字列で見つける必要がある正確な単語をチェックする高度な方法:

import re
text = "This text was of edited by Rock"
#try this string also
#text = "This text was officially edited by Rock" 
for m in re.finditer(r"\bof\b", text):
    if m.group(0):
        print "Present"
    else:
        print "Absent"

3

正規表現の使用は解決策ですが、その場合は複雑すぎます。

テキストを単語のリストに分割するだけです。それにはsplit(separatornumメソッドを使用します。セパレーターセパレーターとして使用して、文字列内のすべての単語のリストを返します。セパレーターが指定されていない場合、すべての空白で分割されます(オプションで、分割数を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'

1
これは良い解決策であり、@ Corvaxに似ています。「First:there ..」のような文字列で「First」という単語が見つかるように、分割する一般的な文字を追加できるという利点があります。@tstempkoの追加文字に「:」が含まれていないことに注意してください。私は...するだろう :)。また、検索で大文字と小文字が区別されない場合は、分割前に単語と文字列の両方で.lower()を使用することを検討してください。mystring.lower().split()そしてword.lower() 私はこれが速く正規表現の例よりもあると思います。
beauk

0

「単語」の前後にスペースを追加するだけです。

x = raw_input("Type your word: ")
if " word " in x:
    print "Yes"
elif " word " not in x:
    print "Nope"

このようにして、「単語」の前後のスペースを探します。

>>> Type your word: Swordsmith
>>> Nope
>>> Type your word:  word 
>>> Yes

2
しかし、単語が文の最初または最後にある場合(スペースなし)
MikeL
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.