2010-04-24 13 views
23

नीचे मेरी स्निपेट में काम नहीं कर रहा, गैर कैप्चरिंग समूह "(?:aaa)" मिलान परिणाम में अनदेखा किया जाना चाहिए, तो परिणाम "_bbb" केवल होना चाहिए।
हालांकि, मुझे मिलान परिणाम में "aaa_bbb" मिलता है; केवल जब मैं समूह निर्दिष्ट करता हूं (2) क्या यह "_bbb" दिखाता है।क्यों नियमित अभिव्यक्ति के "गैर-कैप्चरिंग" समूह

import re 

string1 = "aaa_bbb" 
print(re.match(r"(?:aaa)(_bbb)", string1).group()) 

>>> aaa_bbb 
+1

ठंडा, संपादन के लिए धन्यवाद, और गैर-कैप्चरिंग समूह –

उत्तर

25

group() और group(0) पूरे मैच को वापस कर देगा। बाद के समूह वास्तविक कब्जे वाले समूह हैं।

>>> print (re.match(r"(?:aaa)(_bbb)", string1).group(0)) 
aaa_bbb 
>>> print (re.match(r"(?:aaa)(_bbb)", string1).group(1)) 
_bbb 
>>> print (re.match(r"(?:aaa)(_bbb)", string1).group(2)) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in ? 
IndexError: no such group 
1

प्रयास करें:

print(re.match(r"(?:aaa)(_bbb)", string1).group(1)) 

group()group(0) रूप में ही है और समूह 0 हमेशा मौजूद है और यह पूरे आरई मिलान नहीं है।

2

TFM:

class re.MatchObject

group([group1, ...])

रिटर्न मैच में से एक या एक से अधिक उपसमूहों। यदि कोई तर्क है, तो परिणाम एक स्ट्रिंग है; यदि कई तर्क हैं, तो परिणाम एक आइटम प्रति तर्क के साथ एक tuple है। तर्कों के बिना, समूह 1 शून्य पर डिफ़ॉल्ट (पूरा मिलान वापस आ गया है)। यदि कोई समूहएन तर्क शून्य है, तो संबंधित वापसी मान संपूर्ण मिलान स्ट्रिंग है।

0

आपको इस मामले में केवल पेरेंटेसिस (_bbb) द्वारा कब्जा कर लिया गया हिस्सा प्राप्त करने के लिए group(1) निर्दिष्ट करना होगा।

group() पैरामीटर के बिना पूरी स्ट्रिंग पूरी तरह से नियमित अभिव्यक्ति मिलान करेगा, इससे कोई फर्क नहीं पड़ता कि इसके कुछ हिस्सों को अतिरिक्त रूप से ब्रांडेसिस द्वारा पकड़ा गया था या नहीं।

+0

की अवधारणा को इंगित करने के उत्तर विस्तार विवरण के लिए धन्यवाद :) –

55

मुझे लगता है कि आप "गैर-कैप्चरिंग समूह" की अवधारणा को गलत समझ रहे हैं। गैर-कैप्चरिंग समूह द्वारा मिलान किया गया पाठ अभी भी समग्र रेगेक्स मैच का हिस्सा बन गया है।

दोनों regex (?:aaa)(_bbb) और regex (aaa)(_bbb) कुल मिलान के रूप में aaa_bbb लौटाएं। अंतर यह है कि पहले रेगेक्स में एक कैप्चरिंग समूह है जो _bbb को अपने मैच के रूप में देता है, जबकि दूसरे रेगेक्स में दो कैप्चरिंग समूह हैं जो aaa और _bbb को अपने संबंधित मैचों के रूप में लौटाते हैं। अपने पायथन कोड में, _bbb प्राप्त करने के लिए, आपको पहले रेगेक्स के साथ group(1) और group(2) दूसरे रेगेक्स के साथ उपयोग करने की आवश्यकता होगी।

गैर-कैप्चरिंग समूहों का मुख्य लाभ यह है कि आप रेगेक्स में कैप्चरिंग समूहों की संख्या को परेशान किए बिना उन्हें रेगेक्स में जोड़ सकते हैं। वे (थोड़ा) बेहतर प्रदर्शन भी प्रदान करते हैं क्योंकि रेगेक्स इंजन को गैर-कैप्चरिंग समूहों द्वारा मेल किए गए पाठ का ट्रैक रखने की आवश्यकता नहीं है।

यदि आप वास्तव में कुल रेगेक्स मैच से aaa को बाहर करना चाहते हैं तो आपको lookaround का उपयोग करने की आवश्यकता है। इस मामले में, सकारात्मक दिखने वाला चाल चलता है: (?<=aaa)_bbb। इस रेगेक्स के साथ, group() पायथन में _bbb लौटाता है। कोई कैप्चरिंग समूहों की आवश्यकता नहीं है।

मेरी सिफारिश यह है कि यदि आपके पास रेगेक्स मैच का हिस्सा पाने के लिए कैप्चरिंग समूहों का उपयोग करने की क्षमता है, तो उस विधि का उपयोग लुकराउंड के बजाय करें।

+3

यह स्वीकार किए जाने से कहीं अधिक उपयोगी उत्तर है। – drstevok

0

समूह के बजाय मिलान ऑब्जेक्ट पर समूह विधि का उपयोग करें। यह सभी कैप्चर बफर की एक सूची देता है। बिना किसी तर्क के समूह विधि नियमित अभिव्यक्ति के पूरे मैच को वापस कर रही है।

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