2010-08-30 18 views
8

मुझे स्ट्रिंग में होने पर बहुत सारी दुनिया की जांच करनी है ... कोड इस तरह दिखता है:इसे छोटा (पायथनिक) कैसे बनाया जाए?

if "string_1" in var_string or "string_2" in var_string or "string_3" in var_string or "string_n" in var_string: 
    do_something() 

इसे और अधिक पठनीय और अधिक स्पष्ट कैसे करें?

+0

नियमित अभिव्यक्ति प्राप्त करने के लिए, (लेकिन कैसे अजगर में यह करने के लिए याद नहीं है) – pastjean

उत्तर

35

यह एक तरीका है:

words = ['string_1', 'string_2', ...] 

if any(word in var_string for word in words): 
    do_something() 

संदर्भ: any()

अद्यतन:

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

भी ध्यान रखें कि इस संरचना any के रूप में किसी भी अनावश्यक संगणना से काम नहीं चलेगा अगर यह एक true मूल्य का सामना करना पड़ता है और एक generator expression बूलियन मान बनाने के लिए प्रयोग किया जाता है वापस आ जाएगी। तो आपके पास कुछ प्रकार का short-circuit evaluation भी है जो आमतौर पर बूलियन अभिव्यक्तियों का मूल्यांकन करते समय उपयोग किया जाता है।

+0

धन्यवाद कि मुझे क्या चाहिए ... – Pol

+0

@Pol: आपको इसे स्वीकार किए जाने के रूप में चिह्नित करना चाहिए। –

1

क्या आपने फ़िल्टर देखा है?

filter(lambda x: x in var_string, ["myString", "nextString"]) 

जो तब इस

map(doSomething(), filter(lambda x: x in var_string, ["myString", "nextString"])) 

संपादित पाने के लिए नक्शे के साथ जोड़ा जा सकता है:

निश्चित रूप से

कि आप क्या चाहते हैं नहीं करता है। any समाधान के साथ जाएं। किसी कारण से मैंने सोचा था कि आप इसे सिर्फ एक बार के बजाय हर बार करना चाहते थे।

+0

क्या स्ट्रिंग में मौजूद किसी भी शब्द के लिए 'doSomething() 'निष्पादित नहीं किया जाएगा? –

+0

हां। ओह रुको, वह केवल एक बार चाहता था, नहीं? बकवास। यह बात बताने के लिए धन्यवाद। – wheaties

0
>>> import re 
>>> string="word1testword2andword3last" 
>>> c=re.compile("word1|word2|word3") 
>>> c.search(string) 
<_sre.SRE_Match object at 0xb7715d40> 
>>> string="blahblah" 
>>> c.search(string) 
>>> 
+0

यह मेरी पाइथन आंखों के लिए कम संक्षिप्त और कम पायथनिक प्रतीत होता है – marr75

+5

पायथनिक परिभाषित करें? क्या कुछ पाइथोनिक बनाता है? उपरोक्त एकमात्र संक्षिप्त कथन re.compile और re.search है। बाकी सिर्फ आउटपुट उदाहरण दिखा रहे हैं। ओह रुको, पाइथन दुभाषिया संकेत आपकी पाइथोनिक आंखों को धुंधला कर सकता है ... – ghostdog74

2
import re 
if re.search("string_1|string_2|string_n", var_strings): print True 

अजगर regex की सुंदरता यह है कि यह देता है या तो एक regex वस्तु (है कि क्या मिलान किया पर जानकारियां देता है) या कोई नहीं, कि एक परीक्षण में एक "गलत" मूल्य के रूप में इस्तेमाल किया जा सकता।

2

regex इसके साथ ही होगा:

import re 
words = ['string_1', 'string_2', ...] 

if re.search('|'.join([re.escape(w) for w in words]), var_string): 
    blahblah 
+0

मैं लगभग अपरिवर्तित हूं क्योंकि यह आविष्कारशील है और फ़ेलिक्स क्लिंग को पहले से ही बहुत सारे अपवॉट मिल गए हैं;) लेकिन अगर किसी भी तार में रेगेक्स मेटाएक्टैक्टर्स होते हैं तो यह विफल हो जाता है। – delnan

+0

और यही कारण है कि re.escape है .... – ondra

0

एक और तरीका यह check = lambda a: any(y for y in ['string_%s'%x for x in xrange(0,10)] if y in a)

print check('hello string_1')

संबंधित मुद्दे