में दोहराए गए उप-पैटर्न को कैप्चर करना [email protected]
जैसे कुछ मेल खाने के बाद, मैं (\.\w+)
(या जो मैं कर रहा हूं वह थोड़ा और जटिल है, यह केवल एक उदाहरण है), मैंने (। \ W +) + जोड़ने की कोशिश की, लेकिन यह केवल अंतिम मैच को कैप्चर करता है। उदाहरण के लिए, [email protected]
मैचों में केवल .tr
[email protected]
भाग के बाद शामिल है, इसलिए मैंने .something
और .edu
समूहों को खो दिया। क्या मैं इसे पायथन नियमित अभिव्यक्तियों में कर सकता हूं, या आप पहले सबकुछ मिलान करने का सुझाव देंगे, और बाद में उप-पैटर्न को विभाजित करेंगे?पायथन रेगेक्स
उत्तर
आप केवल बजाय ऐसा करने से आखिरी मैच पर कब्जा करने (\.\w+)+
की समस्या को ठीक कर सकते हैं: ((?:\.\w+)+)
यह काम करेगा:
>>> 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 देखें।
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 में कोड देखें।
जिज्ञासा से, जब आप दोहराए गए कैप्चर से मेल खाते हैं तो आप एक प्रतिस्थापन पैटर्न कैसे लिखते हैं? '\ 1',' \ 2', '\ 3' इत्यादि का अर्थ इस बात पर निर्भर करता है कि आपने कितनी बार' (\। \ W +) 'मिलान किया था? –
@ ली-आंग यिप: '\ 1'' m.group (1) 'के अनुरूप है; अर्थ नहीं बदला है। आप एक फ़ंक्शन का उपयोग प्रतिस्थापन पैटर्न के रूप में कर सकते हैं और इसमें 'm.captures() 'को कॉल कर सकते हैं। – jfs
आपके उदाहरण में, '\ 1',' \ 2', और '\ 3' का अर्थ स्पष्ट है क्योंकि वे केवल एक बार कैप्चर करते हैं। लेकिन '(\। \ W +) + 'के अनुरूप' \ 4' का अर्थ क्या है? '\ 4' इस मामले में' .tr' "चौथा कैप्चर समूह द्वारा मिलान किया गया अंतिम सबस्ट्रिंग" प्रतीत होता है। –
यह वही आप के लिए देख रहा है कर रहे हैं:
>>> import re
>>> s="[email protected]"
>>> r=re.compile("\.\w+")
>>> m=r.findall(s)
>>> m
['.something', '.edu', '.tr']
- 1. रेगेक्स पायथन
- 2. रुबी रेगेक्स बनाम पायथन रेगेक्स
- 3. पायथन रेगेक्स: एक चर
- 4. पायथन रेगेक्स तुरंत
- 5. पायथन रेगेक्स स्ट्रिंग मिलान?
- 6. पायथन रेगेक्स मैच दिनांक
- 7. पायथन रेगेक्स findall
- 8. पायथन रेगेक्स पार्स स्ट्रीम
- 9. पायथन रेगेक्स नकारात्मक लुकबींड
- 10. पायथन रेगेक्स एकाधिक समूह
- 11. पायथन रेगेक्स अजीब व्यवहार
- 12. पायथन/रेगेक्स - मैच #, #। स्ट्रिंग में
- 13. पायथन रेगेक्स खोज और विभाजित
- 14. सरल पायथन रेगेक्स पैटर्न खोजें
- 15. पूर्णांक के लिए पायथन रेगेक्स?
- 16. रेगेक्स
- 17. जावा पैकेज नामों के लिए पायथन रेगेक्स
- 18. पायथन-रेगेक्स, यहां क्या हो रहा है?
- 19. पायथन रेगेक्स कैप्चर केवल कुछ पाठ
- 20. पायथन, रेगेक्स स्प्लिट और विशेष चरित्र
- 21. पायथन रेगेक्स संकलन (re.VERBOSE के साथ)
- 22. पायथन स्ट्रिंग और पार्स टुपल के लिए पायथन रेगेक्स
- 23. रेगेक्स
- 24. रेगेक्स?
- 25. रेगेक्स
- 26. रेगेक्स
- 27. रेगेक्स
- 28. रेगेक्स
- 29. रेगेक्स
- 30. रेगेक्स
संक्षिप्त रूपों के लिए (यदि आप कम मामलों है): 're.sub (उर '((:। [Az] \) {2, }) ', lambda m: m.group (1)। जगह ('। ',' '), पाठ) ' – bahmait
धन्यवाद। मैं ब्रांड्स जोड़ने में सक्षम था, मुझे दोहराए गए उप-पैटर्न से मिलान करने की इजाजत मिली, लेकिन फिर पैटर्न में से एक के साथ मैच में एक समूह था। मैंने नहीं देखा था कि '(?: ...)' एक गैर-कैप्चरिंग समूह बनाता है। https://docs.python.org/2/library/re.html#regular-expression-syntax जो उस समस्या को हल करता है जोड़ना। –