जांचें कि क्या एक और स्ट्रिंग में कई तार मौजूद हैं


378

मैं कैसे जांच सकता हूं कि किसी सरणी में कोई तार किसी अन्य स्ट्रिंग में मौजूद है या नहीं?

पसंद:

a = ['a', 'b', 'c']
str = "a123"
if a in str:
  print "some of the strings found in str"
else:
  print "no strings found in str"

यह कोड काम नहीं करता है, यह सिर्फ यह दिखाना है कि मैं क्या हासिल करना चाहता हूं।


5
मुझे आश्चर्य है कि पूर्ण के संदर्भ में संकलित रेगेक्स की तुलना में कोई उत्तर (अभी तक) नहीं हैं, विशेष रूप से स्ट्रिंग के आकार और "सुइयों" की संख्या की तुलना में।
पैट

3
@Pat मैं हैरान नहीं हूं। सवाल प्रदर्शन को लेकर नहीं है। आज अधिकांश प्रोग्रामर इसे पूरा करने और पठनीयता के लिए अधिक देखभाल करते हैं। प्रदर्शन का प्रश्न मान्य है, लेकिन एक अलग प्रश्न है।
गुफ्तगू

13
एक चर के रूप में str का उपयोग करना भ्रामक है और इसमें अप्रत्याशित व्यवहार हो सकता है क्योंकि यह एक आरक्षित शब्द है; देखने के लिंक
क्लेवर गाइ

regex [abc]भी पूरी तरह से अच्छी तरह से काम करता है और अगर परीक्षण करने के लिए उम्मीदवारों के एक जोड़े से अधिक हैं तो तेजी से होगा। लेकिन अगर तार मनमानी हैं और आप उन्हें रीगेक्स बनाने के लिए पहले से नहीं जानते हैं, तो आपको any(x in str for x in a)दृष्टिकोण का उपयोग करना होगा ।
smci

@CleverGuy आप सही हैं, हालांकि यह आरक्षित शब्द नहीं है, अन्यथा आप इसे असाइन नहीं कर पाएंगे। यह एक बिलिन है।
वेजेंड्रिया

जवाबों:


717

आप उपयोग कर सकते हैं any:

a_string = "A string is more than its parts!"
matches = ["more", "wholesome", "milk"]

if any(x in a_string for x in matches):

इसी तरह यह जांचने के लिए कि क्या सूची से सभी तार पाए जाते हैं, के allबजाय का उपयोग करें any


11
कोई भी () एक पुनरावृत्ति लेता है। मुझे यकीन नहीं है कि आप पायथन के किस संस्करण का उपयोग कर रहे हैं, लेकिन 2.6 में आपको किसी भी () को अपने तर्क के आसपास [] डालने की आवश्यकता होगी। कोई भी ([एक्स में एक्स के लिए इन ए]) ताकि समझ एक पुनरावृत्ति देता है। लेकिन शायद बाद में पायथन के संस्करण पहले से ही ऐसा करते हैं।
एमप्रोड्यूसर

7
@ मार्कर बायर्स: देर से टिप्पणी के लिए क्षमा करें, लेकिन क्या स्ट्रिंग को प्रिंट करने का एक तरीका है जो पाया गया था? आप यह कैसे करेंगे। धन्यवाद।
शंकर कुमार

3
सुनिश्चित नहीं है कि मैं समझता हूं, अगर एक सूची है, और str के खिलाफ मैच की चीज है, तो x क्या है? अजगर नौसिखिया ftw। :)
लाल

2
@red: आप for x in a"सूची में प्रत्येक तत्व के लिए" जैसे पढ़ सकते हैं । चूंकि aतार की एक सूची है, और xउस सूची का एक तत्व है, xएक स्ट्रिंग है (मूल उदाहरण में 'a', 'b', 'c')
उपयोगकर्ता

6
@ नीम बार यह मेरे लिए ठीक काम करता है जैसा कि पाइथन 2.6.9 में है।
MPlanchard

67

any()अब तक का सबसे अच्छा तरीका अगर आप चाहते हैं Trueया हैFalse , लेकिन यदि आप विशेष रूप से जो स्ट्रिंग / तार से मेल खाते हैं जानना चाहता हूँ, आप नीचे दिए कुछ का उपयोग कर सकते हैं।

यदि आप पहला मैच चाहते हैं ( Falseडिफ़ॉल्ट के रूप में):

match = next((x for x in a if x in str), False)

यदि आप सभी मैच (डुप्लिकेट सहित) प्राप्त करना चाहते हैं:

matches = [x for x in a if x in str]

यदि आप सभी गैर-डुप्लिकेट मैच (ऑर्डर की अवहेलना) प्राप्त करना चाहते हैं:

matches = {x for x in a if x in str}

यदि आप सही क्रम में सभी गैर-डुप्लिकेट मैच प्राप्त करना चाहते हैं:

matches = []
for x in a:
    if x in str and x not in matches:
        matches.append(x)

कृपया अंतिम मैच के लिए भी उदाहरण जोड़ें
ओलेग कोकोरिन

@OlegKokorin: यह एक ही क्रम में मिलान स्ट्रिंग्स की एक सूची बनाता है जो उन्हें ढूंढता है, लेकिन यह केवल पहले वाले को रखता है यदि दो समान हैं।
zondo

एक OrderedDictका उपयोग करना शायद एक सूची की तुलना में अधिक प्रदर्शनकारी है। इस उत्तर को "सूचियों में डुप्लिकेट हटा रहा है" पर
wjandrea

44

यदि तार aया strअधिक लंबा हो जाए तो आपको सावधान रहना चाहिए । सीधे समाधान O (S * (A ^ 2)) को लेते हैं, जहां Sकी लंबाई है strऔर A में सभी तारों के लंबों का योग है a। तेज समाधान के लिए, स्ट्रिंग मिलान के लिए अहो-कोरासिक एल्गोरिथ्म देखें, जो रैखिक समय ओ (एस + ए) में चलता है।


क्या अहो-कोरासिक उपसर्गों के बजाय संक्षारण भी खोज सकते हैं?
रेट्रोकोड

1
कुछ अजगर अहो-कोरासिक पुस्तकालय यहाँ और यहाँ हैं
vorpal

23

बस इसके साथ कुछ विविधता जोड़ने के लिए regex:

import re

if any(re.findall(r'a|b|c', str, re.IGNORECASE)):
    print 'possible matches thanks to regex'
else:
    print 'no matches'

या यदि आपकी सूची बहुत लंबी है - any(re.findall(r'|'.join(a), str, re.IGNORECASE))


1
यह प्रश्न के दिए गए उपयोग मामले के लिए काम करता है। यदि आप खोजते हैं (या *यह विफल रहता है, तो रेगेक्स सिंटैक्स के लिए उद्धृत करने की आवश्यकता है।
गुफ्तगू

2
जरूरत पड़ने पर आप इससे बच सकते हैं '|'.join(map(re.escape, strings_to_match))। तुम भी शायद बोते हो re.compile('|'.join(...))
एरियर

12

आपको ए के तत्वों पर पुनरावृति करने की आवश्यकता है।

a = ['a', 'b', 'c']
str = "a123"
found_a_string = False
for item in a:    
    if item in str:
        found_a_string = True

if found_a_string:
    print "found a match"
else:
    print "no match found"

2
हाँ, मैं जानता था कि कैसे करना है, लेकिन मार्क्स के जवाब की तुलना में, यह भयानक कोड है।
जहमाक्स

10
यदि आप मार्क का कोड समझते हैं तो ही। आपके पास समस्या यह है कि आप अपने सरणी के तत्वों की जांच नहीं कर रहे थे। वहाँ बहुत सारे थकाऊ, pythonic तरीके हैं जो आप चाहते हैं कि आपके कोड के साथ क्या गलत था का सार छिपाएगा।
सीमस कैंपबेल

9
यह 'भयानक कोड' हो सकता है लेकिन यह वास्तव में कोई भी () करता है । इसके अलावा, यह आपको मेल खाने वाले वास्तविक स्ट्रिंग देता है, जबकि कोई भी () आपको बताता है कि एक मैच है।
अल्लैडरेमिक्स

4

जटिलता को कम करने के लिए jbernadas ने पहले से ही अहो-कोरासिक-एल्गोरिथम का उल्लेख किया है।

यहाँ पायथन में इसका उपयोग करने का एक तरीका है:

  1. Aho_corasick.py यहां से डाउनलोड करें

  2. इसे अपनी मुख्य पायथन फ़ाइल के समान निर्देशिका में रखें और नाम दें aho_corasick.py

  3. निम्नलिखित कोड के साथ अल्ट्राइथम की कोशिश करें:

    from aho_corasick import aho_corasick #(string, keywords)
    
    print(aho_corasick(string, ["keyword1", "keyword2"]))

ध्यान दें कि खोज केस-संवेदी है


3
a = ['a', 'b', 'c']
str =  "a123"

a_match = [True for match in a if match in str]

if True in a_match:
  print "some of the strings found in str"
else:
  print "no strings found in str"

1

यदि आप एकल शब्द की जाँच करना चाहते हैं, तो यह संदर्भ पर निर्भर करता है, जैसे (किसी भी एक शब्द a, e, w, .. आदि) में पर्याप्त

original_word ="hackerearcth"
for 'h' in original_word:
      print("YES")

यदि आप मूल_शब्द के बीच किसी भी वर्ण की जांच करना चाहते हैं: का उपयोग करें

if any(your_required in yourinput for your_required in original_word ):

यदि आप उस मूल_शब्द में सभी इनपुट चाहते हैं, तो सभी सरल का उपयोग करें

original_word = ['h', 'a', 'c', 'k', 'e', 'r', 'e', 'a', 'r', 't', 'h']
yourinput = str(input()).lower()
if all(requested_word in yourinput for requested_word in original_word):
    print("yes")

आपका क्या होगा? मैं दो चीजों को पहचान सकता हूं: वह वाक्य जहां मैं किसी चीज की तलाश में हूं। मुझे जिन शब्दों की तलाश है। लेकिन आप तीन चर का वर्णन करते हैं और मैं नहीं पा सकता कि तीसरा क्या है।
mayid

1

स्ट्रिंग में सभी सूची तत्वों को प्राप्त करने के तरीके के बारे में कुछ और जानकारी

a = ['a', 'b', 'c']
str = "a123" 
list(filter(lambda x:  x in str, a))

1

आश्चर्यजनक रूप से तेज़ दृष्टिकोण का उपयोग करना है set:

a = ['a', 'b', 'c']
str = "a123"
if set(a) & set(str):
    print("some of the strings found in str")
else:
    print("no strings found in str")

यह कार्य करता है यदि aकोई एकाधिक-वर्ण मान (जिसमें मामला ऊपरany सूचीबद्ध के रूप में उपयोग होता है ) नहीं है। यदि ऐसा है, तो इसे aएक स्ट्रिंग के रूप में निर्दिष्ट करना आसान है a = 'abc':।


0
flog = open('test.txt', 'r')
flogLines = flog.readlines()
strlist = ['SUCCESS', 'Done','SUCCESSFUL']
res = False
for line in flogLines:
     for fstr in strlist:
         if line.find(fstr) != -1:
            print('found') 
            res = True


if res:
    print('res true')
else: 
    print('res false')

आउटपुट उदाहरण छवि


0

मैं गति के लिए इस तरह के फ़ंक्शन का उपयोग करूंगा:

def check_string(string, substring_list):
    for substring in substring_list:
        if substring in string:
            return True
    return False

0
data = "firstName and favoriteFood"
mandatory_fields = ['firstName', 'lastName', 'age']


# for each
for field in mandatory_fields:
    if field not in data:
        print("Error, missing req field {0}".format(field));

# still fine, multiple if statements
if ('firstName' not in data or 
    'lastName' not in data or
    'age' not in data):
    print("Error, missing a req field");

# not very readable, list comprehension
missing_fields = [x for x in mandatory_fields if x not in data]
if (len(missing_fields)>0):
    print("Error, missing fields {0}".format(", ".join(missing_fields)));
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.