2012-03-19 12 views
16

में दोहराए गए उप-पैटर्न को कैप्चर करना [email protected] जैसे कुछ मेल खाने के बाद, मैं (\.\w+) (या जो मैं कर रहा हूं वह थोड़ा और जटिल है, यह केवल एक उदाहरण है), मैंने (। \ W +) + जोड़ने की कोशिश की, लेकिन यह केवल अंतिम मैच को कैप्चर करता है। उदाहरण के लिए, [email protected] मैचों में केवल .tr[email protected] भाग के बाद शामिल है, इसलिए मैंने .something और .edu समूहों को खो दिया। क्या मैं इसे पायथन नियमित अभिव्यक्तियों में कर सकता हूं, या आप पहले सबकुछ मिलान करने का सुझाव देंगे, और बाद में उप-पैटर्न को विभाजित करेंगे?पायथन रेगेक्स

उत्तर

4

आप केवल बजाय ऐसा करने से आखिरी मैच पर कब्जा करने (\.\w+)+ की समस्या को ठीक कर सकते हैं: ((?:\.\w+)+)

+0

संक्षिप्त रूपों के लिए (यदि आप कम मामलों है): 're.sub (उर '((:। [Az] \) {2, }) ', lambda m: m.group (1)। जगह ('। ',' '), पाठ) ' – bahmait

+0

धन्यवाद। मैं ब्रांड्स जोड़ने में सक्षम था, मुझे दोहराए गए उप-पैटर्न से मिलान करने की इजाजत मिली, लेकिन फिर पैटर्न में से एक के साथ मैच में एक समूह था। मैंने नहीं देखा था कि '(?: ...)' एक गैर-कैप्चरिंग समूह बनाता है। https://docs.python.org/2/library/re.html#regular-expression-syntax जो उस समस्या को हल करता है जोड़ना। –

11

यह काम करेगा:

>>> regexp = r"[\w\.][email protected](\w+)(\.\w+)?(\.\w+)?(\.\w+)?(\.\w+)?(\.\w+)?" 
>>> email_address = "[email protected]" 
>>> m = re.match(regexp, email_address) 
>>> m.groups() 
('galactica', '.caprica', '.fleet', '.mil', None, None) 

लेकिन यह छह उपसमूहों की एक अधिकतम करने के लिए सीमित है। यह करने के लिए एक बेहतर तरीका होगा:

>>> m = re.match(r"[\w\.][email protected](.+)", email_address) 
>>> m.groups() 
('galactica.caprica.fleet.mil',) 
>>> m.group(1).split('.') 
['galactica', 'caprica', 'fleet', 'mil'] 

ध्यान दें कि regexps ईमेल पते के रूप में इतने लंबे समय ठीक हैं सरल हैं - लेकिन चीजें हैं जो इस बात के लिए टूट जाएगा के सभी प्रकार देखते हैं। ईमेल पता regexes के विस्तृत उपचार के लिए this question देखें।

19

re मॉड्यूल दोहराया कैप्चर का समर्थन नहीं करता (regex इसका समर्थन करता है):

>>> m = regex.match(r'([.\w]+)@((\w+)(\.\w+)+)', '[email protected]') 
>>> m.groups() 
('yasar', 'webmail.something.edu.tr', 'webmail', '.tr') 
>>> m.captures(4) 
['.something', '.edu', '.tr'] 

अपने मामले मैं बाद में दोहराया subpatterns बंटवारे के साथ जाना चाहते हैं में। यह एक सरल और पठनीय कोड की ओर जाता है उदाहरण के लिए, @Li-aung Yip's answer में कोड देखें।

+0

जिज्ञासा से, जब आप दोहराए गए कैप्चर से मेल खाते हैं तो आप एक प्रतिस्थापन पैटर्न कैसे लिखते हैं? '\ 1',' \ 2', '\ 3' इत्यादि का अर्थ इस बात पर निर्भर करता है कि आपने कितनी बार' (\। \ W +) 'मिलान किया था? –

+0

@ ली-आंग यिप: '\ 1'' m.group (1) 'के अनुरूप है; अर्थ नहीं बदला है। आप एक फ़ंक्शन का उपयोग प्रतिस्थापन पैटर्न के रूप में कर सकते हैं और इसमें 'm.captures() 'को कॉल कर सकते हैं। – jfs

+0

आपके उदाहरण में, '\ 1',' \ 2', और '\ 3' का अर्थ स्पष्ट है क्योंकि वे केवल एक बार कैप्चर करते हैं। लेकिन '(\। \ W +) + 'के अनुरूप' \ 4' का अर्थ क्या है? '\ 4' इस मामले में' .tr' "चौथा कैप्चर समूह द्वारा मिलान किया गया अंतिम सबस्ट्रिंग" प्रतीत होता है। –

1

यह वही आप के लिए देख रहा है कर रहे हैं:

>>> import re 

>>> s="[email protected]" 
>>> r=re.compile("\.\w+") 
>>> m=r.findall(s) 

>>> m 
['.something', '.edu', '.tr'] 
संबंधित मुद्दे