2010-06-14 11 views
37

से मेल खाता है, मेरे पास पायथन और एक स्ट्रिंग में रेगेक्स की एक सूची है। क्या यह जांचने का एक शानदार तरीका है कि सूची में कम से कम एक रेगेक्स स्ट्रिंग से मेल खाता है या नहीं? सुरुचिपूर्ण रूप से, मेरा मतलब है कि सभी रेगेक्स के माध्यम से बस लूपिंग और स्ट्रिंग के खिलाफ उन्हें जांचना और मैच मिलने पर रोकना बेहतर है।पायथन: जांचने के लिए सुरुचिपूर्ण तरीका है कि सूची में कम से कम एक रेगेक्स एक स्ट्रिंग

मूल रूप से, मैं इस कोड था:

list = ['something','another','thing','hello'] 
string = 'hi' 
if string in list: 
    pass # do something 
else: 
    pass # do something else 

अब मैं संभवत: तार से, सूची में कुछ नियमित अभिव्यक्ति करना चाहते हैं, और अगर वहाँ एक के लिए जाँच करने के लिए एक सुरुचिपूर्ण समाधान है मैं सोच रहा हूँ if string in list: को प्रतिस्थापित करने के लिए मिलान करें।

अग्रिम धन्यवाद।

+0

अजगर करता है कुछ भी नहीं है का आनंद उम्मीद है कि Emacs तुतलाना के regexp-ऑप्ट https://www.gnu.org/software/emacs/manual/html_node/elisp/Regexp -फंक्शनक्शन – ggg

+0

आपको लूप क्यों पसंद नहीं है? –

उत्तर

65
import re 

regexes = [ 
    "foo.*", 
    "bar.*", 
    "qu*x" 
    ] 

# Make a regex that matches if any of our regexes match. 
combined = "(" + ")|(".join(regexes) + ")" 

if re.match(combined, mystring): 
    print "Some regex matched!" 
+3

यदि आपको यह जानने की आवश्यकता नहीं है कि कौन सा मेल खाता है, तो उन्हें '(regex)' के बजाय '(?: Regex)' के साथ ब्रैकेट करना बेहतर होगा। –

+2

सरणी में 100 से अधिक regexes (पायथन 2.6) हैं, तो यह विधि काम नहीं करती है। नीचे nosklo का जवाब आज़माएं। – Amjith

+3

'regexes = '(?:% S)'% '|' .join (regexes)' – alxndr

72
import re 

regexes = [ 
    # your regexes here 
    re.compile('hi'), 
# re.compile(...), 
# re.compile(...), 
# re.compile(...), 
] 

mystring = 'hi' 

if any(regex.match(mystring) for regex in regexes): 
    print 'Some regex matched!' 
+0

यदि पायथन 2.4 में काम कर रहा है, तो आपके पास 'कोई भी' नहीं होगा - http://stackoverflow.com/questions/3785433/python-backports-for-some-methods –

+1

यह कैसे है * "बस लूपिंग से बेहतर कुछ सभी regexes और स्ट्रिंग के खिलाफ उन्हें जांच और रोक अगर एक मैच पाया जाता है "*? मुझे लगता है कि नेड का संयोजन और यह जवाब विजेता हो सकता है ... – johndodo

2

दोनों नेड की और Nosklo के जवाब का एक मिश्रण। वर्क्स सूची के किसी भी लम्बाई के लिए गारंटी ... आप

import re 
raw_lst = ["foo.*", 
      "bar.*", 
      "(Spam.{0,3}){1,3}"] 

reg_lst = [] 
for raw_regex in raw_lst: 
    reg_lst.append(re.compile(raw_regex)) 

mystring = "Spam, Spam, Spam!" 
if any(compiled_reg.match(mystring) for compiled_reg in reg_lst): 
    print("something matched") 
संबंधित मुद्दे