पायथन में रेगेक्स स्ट्रिंग से बचना


229

मैं कुछ पाठ की खोज के लिए एक regex पैटर्न के रूप में एक उपयोगकर्ता से इनपुट का उपयोग करना चाहता हूं। यह काम करता है, लेकिन मैं उन मामलों को कैसे संभाल सकता हूं जहां उपयोगकर्ता उन पात्रों को रखता है जिनके पास regex में अर्थ है? उदाहरण के लिए, उपयोगकर्ता Word (s): regex इंजन (s)को एक समूह के रूप में खोजना चाहता है । मैं चाहता हूं कि वह इसे एक स्ट्रिंग की तरह व्यवहार करे "(s)"। मैं replaceउपयोगकर्ता इनपुट पर चला सकता हूं और उसके (साथ \(और उसके )साथ प्रतिस्थापित कर सकता हूं \)लेकिन समस्या यह है कि मुझे हर संभव regex प्रतीक के लिए प्रतिस्थापित करने की आवश्यकता होगी। क्या आप कुछ बेहतर तरीके जानते हैं?

जवाबों:


324

इसके लिए re.escape()फ़ंक्शन का उपयोग करें:

4.2.3 reमॉड्यूल सामग्री

भागने (स्ट्रिंग)

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

एक सरलीकृत उदाहरण, प्रदान की गई स्ट्रिंग की किसी भी घटना को वैकल्पिक रूप से 's' द्वारा खोजें, और मैच ऑब्जेक्ट वापस करें।

def simplistic_plural(word, text):
    word_or_plural = re.escape(word) + 's?'
    return re.match(word_or_plural, text)

53

आप re.escape () का उपयोग कर सकते हैं :

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

>>> import re
>>> re.escape('^a.*$')
'\\^a\\.\\*\\$'

3

दुर्भाग्य से, re.escape()प्रतिस्थापन स्ट्रिंग के लिए अनुकूल नहीं है:

>>> re.sub('a', re.escape('_'), 'aa')
'\\_\\_'

एक समाधान एक मेमने में प्रतिस्थापन करने के लिए है:

>>> re.sub('a', lambda _: '_', 'aa')
'__'

क्योंकि लैम्ब्डा के रिटर्न वैल्यू को re.sub()शाब्दिक स्ट्रिंग के रूप में माना जाता है ।


3
replकरने के लिए तर्क re.subएक स्ट्रिंग, नहीं एक regex है; इसके लिए आवेदन re.escapeकरने से पहली बार में कोई मतलब नहीं है।
ट्रिपलए

5
@tripleee यह गलत है, replतर्क एक साधारण स्ट्रिंग नहीं है, यह पार्स है। मसलन, re.sub(r'(.)', r'\1', 'X')लौटेगा X, नहीं \1
फ्लिम

4
यहाँ replतर्क से बचने के लिए प्रासंगिक सवाल है: stackoverflow.com/q/49943270/247696
Flim

3
संस्करण 3.3 में बदला गया: '_' वर्ण अब बच नहीं रहा है। संस्करण 3.7 में परिवर्तित: केवल ऐसे अक्षर जो एक नियमित अभिव्यक्ति में विशेष अर्थ रख सकते हैं, बच जाते हैं। (इसमें इतना समय क्यों लगा?)
सीस टिमरमैन

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