अजगर स्ट्रिंग चरित्र को रेगेक्स [डुप्लिकेट] से बदल देता है

Nov 27 2020

मैं एक regex समस्या में भाग लेता हूं जिसे मैं नहीं समझता। मैं एक अर्ध-बृहदान्त्र के साथ तार के बीच अल्पविराम को बदलने की कोशिश कर रहा हूं और यह काम नहीं कर रहा है। यहाँ नीचे एक नमूना स्ट्रिंग है। मैंने रेगेक्स नॉन-कैप्चर ग्रुप में "सीक्वेंस" के बाद सब कुछ बदलने के लिए एक रेगेक्स सेट किया, ताकि अंत में कॉमा को नॉन-कैप्चर ग्रुप, सेमी-कोलोन में एकमात्र सबस्ट्रिंग से बदल दिया जाए। लेकिन, यह काम नहीं करता है। यह केवल किसी भी स्ट्रिंग को संरक्षित करने के लिए लगता है जब मैं डालता हूं?: अनुक्रम :) गैर-कैप्चर समूहों के रूप में। जैसे ही मैंने \ d को जोड़ा, यह पूरी चीज़ को बदल देता है। मुझे यकीन नहीं है कि क्यों।

मेरी वास्तविक समस्या में, मेरे पास एक बृहदान्त्र के साथ चिह्नित सामग्री टैग का एक गंभीर और एक अर्ध-बृहदान्त्र के साथ अंत है। टैग अनुक्रम में, अर्ध-बृहदान्त्र के बजाय एक गलत कॉमा है जिसे मुझे बदलने की आवश्यकता है लेकिन सब कुछ अपरिवर्तित छोड़ दें। तो, समाधान को केवल अनुक्रम बदलना चाहिए: 2, अनुक्रम के लिए: 2;

a_string = "tag1: content1 is this tag2: 0.1 amount; tag3: july 2020; sequence:2, tag4: content4"
new_string = re.sub(r"(?:sequence\:)(?:\d)(\,)", ";", a_string)

new_string

मैंने अन्य समाधानों पर ध्यान दिया, जिन्हें काम करना चाहिए, लेकिन इसके लिए नहीं। किसी भी मदद की सराहना की है और कृपया मुझे बताएं कि क्या मैं इस प्रश्न को और अधिक स्पष्ट कर सकता हूं।

जवाब

1 TimBiegeleisen Nov 27 2020 at 06:17

आप शायद यहाँ एक सकारात्मक नकारात्मक खोज का उपयोग करने का इरादा रखते हैं:

a_string = "tag1: content1 is this tag2: 0.1 amount; tag3: july 2020; sequence:2, tag4: content4"
new_string = re.sub(r"(?<=\bsequence:\d)(\,)", ";", a_string)

print(new_string)

यह प्रिंट:

tag1: content1 is this tag2: 0.1 amount; tag3: july 2020; sequence:2; tag4: content4

वैसे, यदि आप sequenceसीधे लक्ष्य कॉमा से पहले पाठ का मिलान करना चाहते हैं, तो यह ठीक है, लेकिन फिर इसे कैप्चरिंग समूह का उपयोग करके बदल दें:

a_string = "tag1: content1 is this tag2: 0.1 amount; tag3: july 2020; sequence:2, tag4: content4"
new_string = re.sub(r"(sequence:\d)(\,)", "\\1;", a_string)
print(new_string)   # same as above