পাইথন - শব্দটি একটি স্ট্রিংয়ে আছে কিনা তা পরীক্ষা করুন


177

আমি পাইথন ভি 2 এর সাথে কাজ করছি এবং আমি যদি শব্দটি স্ট্রিংয়ে থাকে তবে আপনি বলতে পারেন কিনা তা জানার চেষ্টা করছি।

শব্দটি স্ট্রিংয়ে রয়েছে কিনা তা সনাক্ত করার জন্য আমি কিছু তথ্য পেয়েছি - .ফাইন্ড ব্যবহার করে, তবে আইএফ স্টেটমেন্ট করার কোনও উপায় আছে। আমি নিম্নলিখিত মত কিছু পেতে চাই:

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

কোন সাহায্যের জন্য ধন্যবাদ।

উত্তর:


349

সমস্যা কি:

if word in mystring: 
   print 'success'

103
একটি সাবধানতা হিসাবে, যদি আপনার স্ট্রিং থাকে "প্যারাটাইফয়েড খারাপ" এবং আপনি যদি "প্যারাটিফয়েড খারাপ" তে "টাইফয়েড" করেন তবে আপনি সত্য পাবেন।
ডেভিড নেলসন

3
কেউ কীভাবে এই সমস্যাটি কাটিয়ে উঠতে জানেন?
ব্যবহারকারী 2567857

4
@ ব্যবহারকারী 2567857, নিয়মিত প্রকাশ - হিউ বোথওয়েলের উত্তর দেখুন।
মার্ক রাজকক

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
একাধিক শব্দের অনুসন্ধান করার কি খুব দ্রুত পদ্ধতি আছে, কয়েক হাজার শব্দের একটি সেট বলুন, প্রতিটি শব্দের মধ্য দিয়ে যাওয়া লুপের জন্য একটি বিন্যাস না করেই? আমার মিলিয়ন বাক্য আছে এবং মিলিয়ন শর্ত রয়েছে যা কোন বাক্যটির সাথে মিল রয়েছে তা দেখতে অনুসন্ধান করতে terms বর্তমানে এটি প্রক্রিয়া করতে আমার কয়েক দিন সময় লেগেছে, এবং আরও দ্রুত উপায় আছে কিনা তা আমি জানতে চাই।
টম

@ টম পাইথন রেজেক্সের পরিবর্তে গ্রেপ ব্যবহার করার চেষ্টা করুন
এল রুসো

তরোয়ালদলের পক্ষে পি 1
রবিনো

আপনি কীভাবে ব্যতিক্রমগুলি পরিচালনা করবেন, উদাহরণস্বরূপ যখন শব্দটি স্ট্রিংয়ে পাওয়া যায় না?
ফ্যাকফি

1
@ ফ্যাকফি: স্ট্রিংটি খুঁজে পাওয়া না গেলে, ফাংশনটি কিছুই দেয় না (উপরের শেষ উদাহরণটি দেখুন)।
হিউ বোথওয়েল 6'18

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

সম্পাদনা করুন: পাইথন ৩.+++ এর জন্য এই ধারণার সামান্যতম বৈকল্পিক, সমান দ্রুত:

def contains_word(s, w):
    return f' {w} ' in f' {s} '

3
এটি আমার প্রিয় উত্তর :)
ইয়ানস

আমি একমত, কিন্তু দ্রুততম সমাধান re.compile (যেমন ক্ষেত্রে উপেক্ষা করা না ... না।
মাইকেল স্মিথ

7
এটিতে বেশ কয়েকটি সমস্যা রয়েছে: (1) শেষে শব্দ (2) শুরুতে শব্দ (3) এর মধ্যে শব্দগুলির মধ্যেcontains_word("says", "Simon says: Don't use this answer")
মার্টিন থোমা

@ মার্টিনথোমা - ​​যেমন বলা হয়েছে, এই পদ্ধতিটি বিশেষত "পুরো শব্দটি শব্দের ব্যবধানে পৃথক শব্দের তালিকায় রয়েছে কিনা" তা অনুসন্ধানের জন্য। এই পরিস্থিতিতে এটি কার্যকরভাবে কাজ করে: (1) শেষে শব্দ (2) শুরুতে শব্দ (3) এর মধ্যে শব্দ রয়েছে। আপনার উদাহরণটি কেবলমাত্র ব্যর্থ হয়েছে কারণ আপনার শব্দের তালিকায় একটি কোলন রয়েছে।
ব্যবহারকারী200783

1
@ জেফহিটন আবারও, লেখক স্পষ্টভাবে বলেছিলেন, "যদি আপনি পুরো শব্দটি একটি স্থান-বিচ্ছিন্ন শব্দের একটি পৃথকীকরণের তালিকায় রয়েছে কিনা তা খুঁজে পেতে চান" এর জন্য এই পদ্ধতিটি বিশেষভাবে।
বিটউইচ

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

যদি আপনার শব্দগুলিতে রেজেক্স বিশেষ অক্ষর (যেমন +) থাকতে পারে তবে আপনার প্রয়োজন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

রেজেক্স ব্যবহার করা একটি সমাধান তবে এটি সেই ক্ষেত্রে খুব জটিল।

আপনি কেবল শব্দের তালিকায় পাঠ্যকে বিভক্ত করতে পারেন। তার জন্য বিভক্ত ( বিভাজক , সংখ্যা ) পদ্ধতিটি ব্যবহার করুন। এটি স্ট্রিংয়ের সমস্ত শব্দের একটি তালিকা প্রদান করে বিভাজক হিসাবে পৃথককে ব্যবহার করে । তাহলে বিভাজক অনির্দিষ্ট এটা সব হোয়াইটস্পেস উপর splits আছে (ঐচ্ছিকভাবে আপনাকে টুকরা সংখ্যা সীমিত করতে পারেন 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
এটি একটি ভাল সমাধান, এবং @ করভ্যাক্সের অনুরূপ, সাধারণ অক্ষরগুলিকে বিভক্ত করার সাথে যুক্ত করার সুবিধা রয়েছে যাতে "প্রথম: সেখানে .." এর মতো একটি স্ট্রিংয়ে "প্রথম" শব্দটি পাওয়া যায়। মনে রাখবেন যে @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
তবে শব্দের শুরুতে বা বাক্যটির শেষে থাকলে কী হবে (কোনও স্থান নেই)
মাইকেল
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.