Python - Periksa Jika Word Berada Dalam Tali

178

Saya bekerja dengan Python v2, dan saya mencoba mencari tahu apakah Anda dapat mengetahui apakah sebuah kata ada dalam sebuah string.

Saya telah menemukan beberapa informasi tentang mengidentifikasi apakah kata itu di dalam string - menggunakan .find, tetapi apakah ada cara untuk melakukan pernyataan IF. Saya ingin memiliki yang seperti ini:

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

Terima kasih atas bantuannya.

Woo
sumber

Jawaban:

351

Apa yang salah dengan:

if word in mystring: 
   print 'success'
fabrizioM
sumber
103
hanya sebagai peringatan, jika Anda memiliki string "paratyphoid is bad" dan Anda melakukan "typhoid" if dalam "paratyphoid is bad" Anda akan mendapatkan true.
David Nelson
3
Adakah yang tahu cara mengatasi masalah ini?
user2567857
4
@ user2567857, ekspresi reguler - lihat jawaban Hugh Bothwell.
Mark Rajcok
4
if (word1 in mystring dan word2 in mystring)
louie mcconnell
2
Bagaimana ini jawaban yang diterima? !! Itu hanya memeriksa apakah urutan karakter (bukan kata) muncul dalam string
pedram bashiri
168
if 'seek' in 'those who seek shall find':
    print('Success!')

tetapi perlu diingat bahwa ini cocok dengan urutan karakter, belum tentu seluruh kata - misalnya, 'word' in 'swordsmith'Benar. Jika Anda hanya ingin mencocokkan seluruh kata, Anda harus menggunakan ekspresi reguler:

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
Hugh Bothwell
sumber
3
Apakah ada metode yang sangat cepat untuk mencari beberapa kata, katakan satu set beberapa ribu kata, tanpa harus membuat for for loop melalui setiap kata? Saya memiliki sejuta kalimat, dan sejuta istilah untuk dicari guna melihat kalimat mana yang memiliki kata yang cocok. Saat ini saya perlu beberapa hari untuk memproses, dan saya ingin tahu apakah ada cara yang lebih cepat.
Tom
@ Tom mencoba menggunakan grep alih-alih python regex
El Ruso
p1 untuk pendekar pedang
Robino
Bagaimana Anda menangani pengecualian, misalnya ketika kata itu tidak ditemukan dalam string?
FaCoffee
1
@FaCoffee: jika string tidak ditemukan, fungsi mengembalikan None (lihat contoh terakhir di atas).
Hugh Bothwell
48

Jika Anda ingin mengetahui apakah seluruh kata ada dalam daftar kata yang dipisahkan oleh ruang, cukup gunakan:

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

Metode elegan ini juga yang tercepat. Dibandingkan dengan pendekatan Hugh Bothwell dan DaSong:

>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

Sunting: Sedikit variasi pada gagasan ini untuk Python 3.6+, sama cepatnya:

def contains_word(s, w):
    return f' {w} ' in f' {s} '
pengguna200783
sumber
3
Ini adalah jawaban favorit saya :)
IanS
Saya setuju, tetapi solusi tercepat tidak mengabaikan kasus seperti re.compile (... tidak.
Michael Smith
7
Ini memiliki beberapa masalah: (1) Kata-kata di akhir (2) Kata-kata di awal (3) kata-kata di antara seperticontains_word("says", "Simon says: Don't use this answer")
Martin Thoma
@ MartinThoma - Seperti yang dinyatakan, metode ini khusus untuk mengetahui "apakah seluruh kata ada dalam daftar kata yang dipisahkan oleh ruang". Dalam situasi itu, itu berfungsi dengan baik untuk: (1) Kata-kata di akhir (2) Kata-kata di awal (3) kata-kata di antaranya. Contoh Anda hanya gagal karena daftar kata Anda menyertakan titik dua.
user200783
1
@JeffHeaton Sekali lagi, metode ini adalah KHUSUSNYA untuk "Jika Anda ingin mengetahui apakah seluruh kata ada dalam daftar kata yang dipisahkan oleh ruang", seperti yang dinyatakan oleh penulis dengan jelas.
bitwitch
17

find mengembalikan integer yang menunjukkan indeks tempat item pencarian ditemukan. Jika tidak ditemukan, ia mengembalikan -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.'
Matt Howell
sumber
13

Anda dapat membagi string ke kata-kata dan memeriksa daftar hasil.

if word in string.split():
    print 'success'
Corvax
sumber
3
Harap gunakan tautan edit untuk menjelaskan cara kerja kode ini dan jangan hanya memberikan kode tersebut, karena penjelasan lebih mungkin membantu pembaca di masa mendatang.
Jed Fox
1
Ini harus menjadi jawaban aktual untuk mencocokkan seluruh kata.
Kaushik NP
10

Fungsi kecil ini membandingkan semua kata pencarian dalam teks yang diberikan. Jika semua kata pencarian ditemukan dalam teks, mengembalikan panjang pencarian, atauFalse sebaliknya.

Juga mendukung pencarian string 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

pemakaian:

find_words('çelik güray ankara', 'güray ankara')
Guray Celik
sumber
8

Jika mencocokkan urutan karakter tidak cukup dan Anda perlu mencocokkan seluruh kata, berikut adalah fungsi sederhana yang menyelesaikan pekerjaan. Pada dasarnya menambahkan spasi di mana diperlukan dan mencari itu di string:

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

Ini mengasumsikan bahwa koma dan tanda baca lainnya telah dihapus.

juga
sumber
Solusi ini bekerja paling baik untuk kasus saya karena saya menggunakan string yang dipisahkan ruang tokenized.
Avijit
4

Ketika Anda meminta kata dan bukan untuk string, saya ingin menyajikan solusi yang tidak sensitif terhadap awalan / sufiks dan mengabaikan case:

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

Jika kata-kata Anda mungkin berisi karakter khusus regex (seperti +), maka Anda perlure.escape(word)

Martin Thoma
sumber
3

Cara lanjutan untuk memeriksa kata yang tepat, yang perlu kita temukan dalam string panjang:

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"
Rameez
sumber
3

Menggunakan regex adalah solusi, tetapi terlalu rumit untuk kasus itu.

Anda cukup membagi teks menjadi daftar kata-kata. Gunakan metode split ( separator , num ) untuk itu. Ini mengembalikan daftar semua kata dalam string, menggunakan pemisah sebagai pemisah. Jika separator tidak ditentukan, ia terbagi di semua spasi putih (opsional Anda dapat membatasi jumlah pemisahan menjadi num ).

list_of_words = mystring.split()
if word in list_of_words:
    print 'success'

Ini tidak akan berfungsi untuk string dengan koma dll. Misalnya:

mystring = "One,two and three"
# will split into ["One,two", "and", "three"]

Jika Anda juga ingin membagi semua koma dll. Gunakan argumen pemisah seperti ini:

# 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'
tstempko
sumber
1
Ini adalah solusi yang baik, dan mirip dengan @Corvax, dengan manfaat menambahkan karakter umum untuk dipisah sehingga dalam sebuah string seperti "Pertama: di sana ..", kata "Pertama" dapat ditemukan. Perhatikan bahwa @tstempko tidak termasuk ":" di karakter tambahan. Saya akan :). Juga, jika pencarian tidak peka huruf besar-kecil, pertimbangkan untuk menggunakan .lower () pada kata dan string sebelum pemisahan. mystring.lower().split()dan word.lower() saya pikir ini juga lebih cepat daripada contoh regex.
beauk
0

Anda bisa menambahkan spasi sebelum dan sesudah "kata".

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

Dengan cara ini terlihat spasi sebelum dan sesudah "kata".

>>> Type your word: Swordsmith
>>> Nope
>>> Type your word:  word 
>>> Yes
PyGuy
sumber
2
Tetapi bagaimana jika kata itu ada di awal atau di akhir kalimat (tanpa spasi)
MikeL