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.

Jawaban:


351

Apa yang salah dengan:

if word in mystring: 
   print 'success'

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

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

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

13

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

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

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

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.


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)


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"

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'

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

2
Tetapi bagaimana jika kata itu ada di awal atau di akhir kalimat (tanpa spasi)
MikeL
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.