2011-11-08 17 views
5

मैं अजगर के साथ एक लॉग को पार्स कर रहा हूँ और जरूरत जल्दी से यहकई समूह एकल regex

इस सरल बराबर regex और उपयोग का उदाहरण देखने

pat = re.compile("(1(2[3456]+2)+1)*") 

यह काम नहीं करता है कुछ मान लाने के लिए मेल खाता है जैसा कि अपेक्षित है, केवल अंतिम मैच समूह pat.match() द्वारा समूह लौटाया जाता है। समूह()

ऐसी समस्याओं के लिए सबसे आसान समाधान क्या है?

अद्यतन (विकि इंजन बल्कि नई पोस्ट बनाने की तुलना में संपादित उपयोग करने के लिए कहते हैं के रूप में):

मैं बार-बार मैचों की जरूरत है, निश्चित रूप से।

to_match="1232112542254211232112322421" 

रेगेक्स खोजने को दो बार पुनरावर्ती रूप से लागू करने की आवश्यकता है। मैं इसे सहन कर सकता हूं, लेकिन क्या कोई विकल्प है?

+1

बदलें '*' '' ''। '" (1 (2 [3456] +2) +1)? "' –

+0

[पायथन रेगेक्स एकाधिक समूहों] के संभावित डुप्लिकेट (http://stackoverflow.com/questions/4963691/), [एकाधिक अभिव्यक्ति समूह एकाधिक के साथ कैप्चर मैचों] (http://stackoverflow.com/questions/5598340/), [पायथन regexes: समूह के एकाधिक मैचों तक कैसे पहुंचे?] (http://stackoverflow.com/questions/5060659/)। – outis

उत्तर

1

ठीक है पर कब्जा बनाम एक पर कब्जा कर लिया समूह दोहराते अधिक के लिए यहाँ देखें, इस (लेकिन केवल तब आप कैसे जवाब स्वीकार करने के लिए सीखा कोशिश; -))

s = "123321124421125521" 
pat = re.compile("(1(2[3456]+2)+1)") 
print pat.findall(s) 

परिमाणक को हटाने और बजाय findall() का उपयोग करें। यह इस सूची में परिणाम होगा:

[('123,321', '2332'), ('124,421', '2442'), ('125,521', '2552')]

1

आप दोहराए गए समूह को कैप्चर करने के बजाय एक कब्जे वाले समूह को दोहरा रहे हैं और यही वजह है कि आपको केवल अंतिम कैप्चर मिल रहा है।

आप का उपयोग करना चाहिए

pat = re.compile("((1(2[3456]+2)+1)*)") 

एक दोहराया समूह http://www.regular-expressions.info/captureall.html

+2

पूरे पैटर्न के चारों ओर ब्रैकेट डालने का कोई मतलब नहीं है। पूरे पैटर्न का मिलान पहले से ही 'समूह (0)' में संग्रहीत है। आपके समाधान में 'समूह (0) 'और' समूह (1) 'वही हैं। – stema

+0

@stema आप सही हैं, लेकिन स्पष्ट रूप से ओपी इस सवाल में जो कहते हैं उससे 'समूह (1)' को देख रहा है। यहां एक संभावना भी है कि यहां दिया गया रेगेक्स केवल वास्तविक रेगेक्स का हिस्सा है जो ओपी को समस्या का कारण बन रहा है और दिए गए रेगेक्स के बाएं/दाएं कुछ हो सकता है जिसमें 'समूह (0)' हो सकता है क्या ज़रूरत है। –

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