पायथन रेगेक्स तुरंत समूहों को बदल देता है


106

क्या रेगेक्स सिंटैक्स का उपयोग करके सभी समूहों को सीधे बदलने का कोई तरीका है?

सामान्य तरीका:

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

लेकिन मैं कुछ ऐसा हासिल करना चाहता हूं:

re.match(r"(\d.*?)\s(\d.*?)", "(CALL_GROUP_1) (CALL_GROUP_2)")

मैं उन समूहों से तुरंत नए स्ट्रिंग का निर्माण करना चाहता हूं जो रेगेक्स ने अभी कैप्चर किए हैं।

जवाबों:


189

पर एक नज़र है re.sub:

result = re.sub(r"(\d.*?)\s(\d.*?)", r"\1 \2", string1)

यह पायथन का रेगेक्स प्रतिस्थापन (बदलें) फ़ंक्शन है। प्रतिस्थापन स्ट्रिंग को तथाकथित बैकरेफ्रेंस (बैकस्लैश, ग्रुप नंबर) से भरा जा सकता है जो कि समूहों द्वारा मिलान किए गए के साथ बदल दिए जाते हैं। समूह को group(...)फ़ंक्शन द्वारा समान रूप से गिना जाता है , अर्थात् 1, बाएं से दाएं, कोष्ठक खोलकर।


4
डॉक्टर की तुलना में अधिक स्पष्ट है! समझ में नहीं आया कि यह समूह किस तरह से काम कर रहा था। उन्हें इस तरह के उदाहरण को जोड़ना चाहिए।
Y0da

यह पहली बार से काम किया, यह समझाने के लिए एक बहुत अच्छा स्पष्ट तरीका है। धन्यवाद और क्या आप समझा सकते हैं कि उप समूह को उचित तरीके से (r(r))r((r)((r)r))थोड़े स्थिति में कैसे कॉल किया जाना चाहिए ?
रक्षिता मुरंगा रोड्रिगो

1
@RakshithaMurangaRodrigo समूहों को बाएं से दाएं तक गिना जाता है, जहां वे शुरू करते हैं। इसलिए यदि मैं समूह के सामने प्रत्येक समूह की संख्या सम्मिलित करता हूं, तो उन्हें क्रमबद्ध किया जाएगा 1(r2(r))r3(4(r)5(6(r)r)):।
मार्टिन एंडर

@MartinEnder: बहुत बहुत धन्यवाद!
रक्षिता मुरंगा रोड्रिगो

30

स्वीकृत उत्तर एकदम सही है। मैं इस वाक्य-विन्यास का उपयोग करके संभवतः समूह संदर्भ को बेहतर तरीके से प्राप्त करूंगा:

r"\g<1> \g<2>"

प्रतिस्थापन स्ट्रिंग के लिए। इस तरह, आप सिंटैक्स सीमाओं के आसपास काम करते हैं जहां एक समूह एक अंक द्वारा पीछा किया जा सकता है। फिर से, यह सब डॉक्टर में मौजूद है, कुछ भी नया नहीं है, बस कभी-कभी पहली नजर में देखना मुश्किल है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.