2011-09-20 22 views
6

मैं रूबी फ़ंक्शन स्कैन के समान पाइथन में कार्यक्षमता खोजने की कोशिश कर रहा हूं। मेरा लक्ष्य एक सूची में दो घुंघराले ब्रेसिज़ के बीच में सभी पाठ को पकड़ना है। यदि स्ट्रिंग में घुंघराले ब्रेसिज़ के कई जोड़े हैं, तो मैं सूची में एकाधिक प्रविष्टियां रखना चाहता हूं।पायथन रेगेक्स कैप्चर केवल कुछ पाठ

मुझे इस कोड को चलाने: मैं पाठ से मेल

match = re.search(r'\{(.+)\}', request.params['upsell']) 
print match.group() 

। हालांकि, कब्जे में क्या घुंघराले ब्रेसिज़ शामिल हैं। मैं इस पाठ को शामिल नहीं करना चाहता, मैं बीच में सब कुछ शामिल करना चाहता हूं, लेकिन घुंघराले ब्रेसिज़ धन्यवाद नहीं!

उत्तर

9
re.findall(r'\{(.+?)\}', request.params['upsell']) 

यह एक सूची लौटाएगा जहां प्रत्येक प्रविष्टि घुंघराले ब्रेसिज़ के एक अलग समूह की सामग्री होगी। ध्यान दें कि यह नेस्टेड ब्रेसिज़ के लिए काम नहीं करेगा।

?.+ के बाद यह एक आलसी मैच (लालची के विपरीत) बना देगा। इसका मतलब यह है कि मैच पहले "}" पर बंद हो जाएगा, जितना संभव हो सके उतने पात्रों से मिलान करने और अंतिम समापन ब्रेस पर समाप्त होने के बजाय।

re.findall() आपकी स्ट्रिंग के माध्यम से खोज करेगा और सभी गैर-ओवरलैपिंग मैचों को ढूंढेगा, और समूह को वापस कर देगा। वैकल्पिक रूप से आप re.finditer() का उपयोग कर सकते हैं जो मिलान ऑब्जेक्ट्स पर फिर से शुरू हो जाएगा, लेकिन फिर आपको ब्रेसिज़ के अंदर केवल यह प्राप्त करने के लिए match.group(1) का उपयोग करना होगा। यह भी है कि आपको अपने उदाहरण में बदलने की आवश्यकता होगी, match.group() पूरे मैच को कैप्चर किए गए समूह को वापस नहीं लौटाता है, जिसके लिए आपको उस समूह के लिए नंबर डालना होगा, जिसे आप चाहते हैं।

1
>>> import re 
>>> re.findall(r'{([^{}]*)}', '{a} { {b} c { {d} } }') 
['a', 'b', 'd'] 
9

group(1), या lookbehinds/आगे का उपयोग करें। (इसके अलावा, F.J. और J.F. की सलाह लेने के लिए और उपयोग करने के लिए सुनिश्चित हो या तो .+? या [^{}]*

import re 
match = re.search(r'\{(.+)\}', "asdfasd {asdf}asdfasdf") 
print match.group(1) 

या lookbehinds/Aheads साथ:

import re 
match = re.search(r'(?<=\{)(.+)(?=\})', "asdfasd {asdf}asdfasdf") 
print match.group() 
संबंधित मुद्दे