2016-03-11 4 views
5

उदाहरण के लिए की जगह regex की सभी घटनाओं को बदलने के लिए, मैं "2x4" को "2 XBY 4" जो मैं रूपांतरित करना चाहते हैं की तरह उत्पाद आयामों की एक बहुत कुछ के साथ पाठ है।कैसे के रूप में यदि लागू करने के बार-बार

pattern = r"([0-9])\s*[xX\*]\s*([0-9])" 

re.sub(pattern, r"\1 xby \2", "2x4") 
'2 xby 4' # good 

re.sub(pattern, r"\1 xby \2", "2x4x12") 
'2 xby 4x12' # not good. need this to be '2 xby 4 xby 12' 

मैं जो करना चाहता हूं उसका वर्णन करने का एक तरीका तब तक प्रतिस्थापन दोहराता है जब तक कि कोई और प्रतिस्थापन नहीं किया जा सके। उदाहरण के लिए, मैं ऊपर प्रतिस्थापन के लिए बस दो बार जो मैं चाहता

x = re.sub(pattern, r"\1 xby \2", "2x4x12") 
x = re.sub(pattern, r"\1 xby \2", x) 
'2 xby 4 xby 12' 

प्राप्त करने के लिए कर सकते हैं लेकिन मैं वहाँ एक बेहतर तरीका

उत्तर

5

आप खोज के लिए इस अग्रदर्शी regex का उपयोग कर सकते हैं:

r'([0-9]+)\s*[xX*]\s*(?=[0-9]+)' 

(?=[0-9]+) सकारात्मक अग्रदर्शी कि बस आगे देख कर दूसरे नंबर की उपस्थिति का दावा है लेकिन संख्या का मिलान करके आंतरिक regex पॉइंटर को चलाने नहीं करता है।

और प्रतिस्थापन के लिए इस का उपयोग करें:

r'\1 xby ' 

RegEx Demo

कोड:

>>> pattern = r'([0-9]+)\s*[xX*]\s*(?=[0-9]+)' 

>>> re.sub(pattern, r'\1 xby ', "2x4") 
'2 xby 4' 

>>> re.sub(pattern, r'\1 xby ', "2x4x12") 
'2 xby 4 xby 12' 
+1

मैं मैं इस बेहतर भले ही मैंने सोचा कि मैं इस सवाल का जवाब था की तरह लगता है। लुकहेड इसे प्राप्त करना चाहिए क्योंकि प्रतिस्थापन बाएं से दाएं किया जाता है। – NickT

+1

धन्यवाद। क्या आप स्पष्ट रूप से समझा सकते हैं कि यह क्या कर रहा है? यह सही लगता है, लेकिन मैं पूरी तरह से समझ में नहीं आता क्यों। – Ben

+1

मैंने उत्तर में लुकहेड का स्पष्टीकरण जोड़ा है। – anubhava

0

जब से तुम कोशिश कर रहे हैं पाठ के खिलाफ मैच को फिर से चलाने पहले से ही है कि मान रेगेक्स द्वारा परिवर्तित किया गया है, वास्तव में एक बेहतर तरीका नहीं है।

यह गणित की समस्या को अनदेखा करने जैसा है, यदि आप करना चाहते हैं: (2 + 3) + 4, आपको "5 + 4" को प्रतिस्थापित करने में सक्षम होने के लिए "(2 + 3)" को प्रतिस्थापित करने की आवश्यकता होगी चूंकि स्ट्रिंग "5" आपके मूल पाठ में कहीं भी नहीं है।

आप क्या करना चाहते हो सकता है क्या किसी भी मैच के लिए अपने स्ट्रिंग का परीक्षण, और अपने पिछले परिणामों पर अपने प्रतिस्थापन फिर से चल रहा है जब तक कोई और अधिक मिलान नहीं पाए जाते रहते हैं।

संपादित करें: आप, साथ ही बार यह दोहराने की संख्या के कुछ regexes और उन्हें लंबाई के अवरोही क्रम में चला सकते हैं। अर्थात। तो फिर 2x3 2x3x5 2x3x5x2 के लिए देखो, के बाद से उत्तरोत्तर तुम कुछ भी है कि पहले से ही बदल दिया गया था हिट नहीं होंगे।

1

मुझे लगता है कि आप एक ही पास के साथ इस संपर्क कर सकते हैं के बारे में थोड़ा अलग तरीके से सोच कर, यह। ताकि आप पूरी स्ट्रिंग एक बार स्कैन कर सकते हैं, यदि आप अंक के दाईं ओर का उपभोग नहीं करते - क्या तुम सच में ऐसा करने के लिए प्रयास कर रहे हैं की जगह XBY साथ एक्स है।

इस के लिए, मैं एक नज़र आगे जोर सलाह देते हैं। असल में, इस बात की पुष्टि है कि बात यह है कि आप स्थान ले रही हैं अंकों द्वारा पीछा किया जाता है, लेकिन इस प्रक्रिया में अंक नहीं खाते हैं। इस टिप्पणी है (= ...?) - re docpage देखते हैं।

मेरे लिए, मैं निम्नलिखित है - ध्यान दें कि regex संकलन वैकल्पिक है और \ घ आमतौर पर करने के लिए पसंद किया जाता है [0-9]:

pattern = re.compile(r"(\d+)\s*[xX\*]\s*(?=\d)") 
pattern.sub(r"\1 xby ", "2x4x12") 

'2 xby 4 xby 12' 

एक पास में, यह पूरी स्ट्रिंग पर कार्रवाई करेंगे ।

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