पायथन - जाँच करें कि क्या शब्द एक स्ट्रिंग में है


177

मैं पायथन v2 के साथ काम कर रहा हूं, और मैं यह पता लगाने की कोशिश कर रहा हूं कि क्या आप बता सकते हैं कि कोई शब्द स्ट्रिंग में है या नहीं।

मुझे यह पता लगाने के बारे में कुछ जानकारी मिली है कि क्या शब्द स्ट्रिंग में है - उपयोग .find, लेकिन क्या एक IF स्टेटमेंट करने का कोई तरीका है। मैं निम्नलिखित की तरह कुछ करना चाहते हैं:

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

किसी भी मदद के लिए धन्यवाद।

जवाबों:


349

के साथ गलत क्या है:

if word in mystring: 
   print 'success'

103
बस एक सावधानी के रूप में, यदि आपके पास एक स्ट्रिंग है "पैराटीफॉइड खराब है" और आप एक "टाइफाइड" करते हैं तो "पैराटीफॉइड खराब है" आपको एक सच मिलेगा।
डेविड नेल्सन

3
किसी को पता है कि इस समस्या को कैसे दूर किया जाए?
user2567857

4
@ user2567857, नियमित अभिव्यक्ति - ह्यूग बोथवेल का उत्तर देखें।
मार्क राजकॉक

4
अगर (रहस्य में शब्द 1 और रहस्य में शब्द 2)
लूई मैककोनेल

2
यह कैसे स्वीकृत उत्तर है? !! यह सिर्फ यह जांचता है कि क्या पात्रों का एक क्रम (एक शब्द नहीं) एक स्ट्रिंग में दिखाई देता है
पेड्रम बशीरी

168
if 'seek' in 'those who seek shall find':
    print('Success!')

लेकिन ध्यान रखें कि यह वर्णों के अनुक्रम से मेल खाता है, जरूरी नहीं कि एक संपूर्ण शब्द - उदाहरण के लिए, 'word' in 'swordsmith'सच है। यदि आप केवल पूरे शब्दों का मिलान करना चाहते हैं, तो आपको नियमित अभिव्यक्ति का उपयोग करना चाहिए:

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
क्या प्रत्येक शब्द से गुजरने वाले लूप का निर्माण करने के लिए, कई शब्दों की खोज करने के लिए कई शब्दों का एक बहुत तेज़ तरीका है? मेरे पास एक लाख वाक्य हैं, और एक लाख शब्द हैं जो देखने के माध्यम से खोजते हैं कि किस वाक्य में कौन से शब्द हैं। वर्तमान में मुझे प्रक्रिया में दिन लग रहे हैं, और मैं जानना चाहता हूं कि क्या कोई तेज तरीका है।
टॉम

@ टॉम अजगर की जगह क्रेप का इस्तेमाल करने की कोशिश करते हैं
एल रुसो


जब आप शब्द स्ट्रिंग में नहीं मिलते हैं, तो आप अपवादों को कैसे संभालते हैं?
फ़ॉफ़ी

1
@ फ़ॉफ़ी: यदि स्ट्रिंग नहीं मिली है, तो फ़ंक्शन कोई नहीं लौटाता है (ऊपर अंतिम उदाहरण देखें)।
ह्यूग बोथवेल

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

संपादित करें: पायथन 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")
मार्टिन थोमा

@MartinThoma - जैसा कि कहा गया है, यह विधि विशेष रूप से यह पता लगाने के लिए है कि "क्या एक पूरा शब्द शब्दों की एक अलग-अलग सूची में है"। उस स्थिति में, यह ठीक काम करता है: (1) अंत में शब्द (2) शब्द शुरुआत में (3) शब्द बीच में। आपका उदाहरण केवल विफल रहता है क्योंकि आपके शब्दों की सूची में एक बृहदान्त्र शामिल है।
user200783

1
@JeffHeaton एक बार फिर से, यह विधि "यदि आप यह जानना चाहते हैं कि क्या एक पूरा शब्द शब्दों की एक अलग-अलग सूची में है", जैसा कि लेखक ने स्पष्ट रूप से कहा है।
बिटविच

17

खोज आइटम पाए जाने के सूचकांक का प्रतिनिधित्व करने वाला पूर्णांक देता है। यदि यह नहीं मिला है, तो यह -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
कृपया एडिट लिंक का उपयोग करें कि यह कोड कैसे काम करता है और कोड को न दें, क्योंकि स्पष्टीकरण से भविष्य के पाठकों की मदद करने की अधिक संभावना है।
जेड फॉक्स

1
यह पूरे शब्द के मिलान के लिए वास्तविक उत्तर होना चाहिए।
कौशिक एनपी

10

यह छोटा कार्य दिए गए पाठ में सभी खोज शब्दों की तुलना करता है। यदि सभी खोज शब्द पाठ में पाए जाते हैं, तो खोज की लंबाई, या Falseअन्यथा।

यूनिकोड स्ट्रिंग खोज का भी समर्थन करता है।

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

यह मानता है कि अल्पविराम और अन्य विराम चिह्न पहले ही छीन लिए गए हैं।


इस सॉल्यूशन ने मेरे केस के लिए सबसे अच्छा काम किया क्योंकि मैं टोकेनाइज्ड स्पेस अलग स्ट्रिंग्स का उपयोग कर रहा हूं।
अविजित

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

यदि आपके शब्दों में regex विशेष वर्ण (जैसे +) हो सकते हैं , तो आपको आवश्यकता है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

रेगेक्स का उपयोग करना एक समाधान है, लेकिन यह उस मामले के लिए बहुत जटिल है।

आप बस शब्दों की सूची में पाठ को विभाजित कर सकते हैं। उसके लिए विभाजन ( विभाजक , संख्या ) विधि का उपयोग करें । यह स्ट्रिंग में सभी शब्दों की सूची लौटाता है, विभाजक के रूप में विभाजक का उपयोग करता है। यदि विभाजक अनिर्दिष्ट है तो यह सभी व्हाट्सएप पर विभाजित होता है (वैकल्पिक रूप से आप विभाजन की संख्या को संख्या तक सीमित कर सकते हैं )।

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 के समान, सामान्य वर्णों को जोड़ने के लाभ के साथ, ताकि "पहले: वहाँ .." जैसे स्ट्रिंग में, "प्रथम" शब्द मिल सके। ध्यान दें कि @tstempko अतिरिक्त वर्णों में ":" शामिल नहीं है। मैं :)। इसके अलावा, यदि खोज केस-असंवेदनशील है, तो विभाजन से पहले शब्द और स्ट्रिंग दोनों पर .lower () का उपयोग करने पर विचार करें। mystring.lower().split()और word.lower() मुझे लगता है कि यह रेगेक्स उदाहरण से भी तेज है।
बीमुक

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
लेकिन क्या होगा यदि शब्द वाक्य की शुरुआत या अंत में है (कोई स्थान नहीं)
माइक डीएल
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.