पायथन में रेगुलर एक्सप्रेशन में विशेष वर्णों को एस्केप करना
मान लीजिए कि आप चाहते हैं कि एक विशेष वर्ण स्वयं का प्रतिनिधित्व करे। इसके लिए आपको बैकस्लैश का उपयोग करके इसे एस्केप करना होगा। आइए उदाहरणों से समझते हैं।
उदाहरण
निम्नलिखित उदाहरण में, रेगुलर एक्सप्रेशन के लेखक चाहते थे
कि खोज पैटर्न इस तरह दिखे: अक्षर
'a', फिर प्लस चिह्न '+', फिर
अक्षर 'x'। हालाँकि, कोड के लेखक ने
'+' वर्ण को एस्केप नहीं किया और इसलिए
वास्तव में खोज पैटर्न इस तरह दिखता है:
अक्षर 'a' एक या अधिक बार,
फिर अक्षर 'x':
txt = 'a+x ax aax aaax'
res = re.sub('a+x', '!', txt)
print(res)
कोड निष्पादन का परिणाम:
'a+x ! ! !'
उदाहरण
और अब लेखक ने प्लस चिह्न को बैकस्लैश से एस्केप कर दिया है।
अब खोज पैटर्न वैसा ही दिखता है, जैसा होना चाहिए: अक्षर 'a', फिर प्लस चिह्न
'+', फिर अक्षर 'x':
txt = 'a+x ax aax aaax'
res = re.sub('a\+x', '!', txt)
print(res)
कोड निष्पादन का परिणाम:
'! ax aax aaax'
उदाहरण
इस उदाहरण में, पैटर्न इस तरह दिखता है:
अक्षर 'a', फिर डॉट '.',
फिर अक्षर 'x':
txt = 'a.x abx azx'
res = re.sub('a\.x', '!', txt)
print(res)
कोड निष्पादन का परिणाम:
'! abx azx'
उदाहरण
निम्नलिखित उदाहरण में, लेखक स्लैश को एस्केप करना भूल गया और रेगुलर एक्सप्रेशन ने सभी सबस्ट्रिंग को पकड़ लिया, क्योंकि अनएस्केप्ड डॉट किसी भी वर्ण का प्रतिनिधित्व करती है:
txt = 'a.x abx azx'
res = re.sub('a.x', '!', txt)
print(res)
कोड निष्पादन का परिणाम:
'! ! !'
टिप्पणी
ध्यान दें कि यदि आप डॉट के लिए बैकस्लैश भूल जाते हैं (जब उसे स्वयं का प्रतिनिधित्व करना चाहिए) - इसपर ध्यान नहीं जा सकता है:
res = re.sub('a.x', '!', 'a.x')
print(res) # '!' लौटाएगा, जैसा हम चाहते थे
दृष्टिगत रूप से यह सही ढंग से काम करता है (क्योंकि डॉट
किसी भी वर्ण का प्रतिनिधित्व करती है, जिसमें
सामान्य डॉट '.' भी शामिल है)। लेकिन यदि
वह स्ट्रिंग बदल दें, जिसमें प्रतिस्थापन हो रहा है - तो
हम अपनी गलती देखेंगे:
res = re.sub('a.x', '!', 'a.x abx azx')
print(res) # '! ! !' लौटाएगा, जबकि अपेक्षा थी '! abx azx'
विशेष वर्णों और सामान्य वर्णों की सूची
यदि एक सामान्य वर्ण को एस्केप कर दें - तो कुछ बुरा नहीं होगा - वह फिर भी स्वयं का प्रतिनिधित्व करेगा। इसका अपवाद - अंक हैं, उन्हें एस्केप नहीं किया जा सकता।
अक्सर संदेह उत्पन्न होता है कि क्या दिया गया वर्ण विशेष है। कुछ लोग तो सभी संदिग्ध वर्णों को एक के बाद एक एस्केप करने लगते हैं। हालाँकि, यह एक बुरी आदत है (यह रेगुलर एक्सप्रेशन को बैकस्लैश से अव्यवस्थित कर देती है)।
विशेष वर्ण हैं: $ ^ . * + ? \ / {} [] () |
विशेष वर्ण नहीं हैं: @ : , ' " - _ = < > % # ~ `& !
व्यावहारिक समस्याएं
एक स्ट्रिंग दी गई है:
txt = 'a.a aba aea'
एक रेगुलर एक्सप्रेशन लिखें, जो स्ट्रिंग
'a.a' को ढूंढे, बाकी को नहीं।
एक स्ट्रिंग दी गई है:
txt = '2+3 223 2223'
एक रेगुलर एक्सप्रेशन लिखें, जो स्ट्रिंग
'2+3' को ढूंढे, बाकी को नहीं।
एक स्ट्रिंग दी गई है:
txt = '23 2+3 2++3 2+++3 345 567'
एक रेगुलर एक्सप्रेशन लिखें, जो स्ट्रिंग्स
'2+3', '2++3', '2+++3',
को ढूंढे, बाकी को नहीं (+ कितनी भी संख्या में हो सकता है)।
एक स्ट्रिंग दी गई है:
txt = '23 2+3 2++3 2+++3 445 677'
एक रेगुलर एक्सप्रेशन लिखें, जो स्ट्रिंग्स
'23', '2+3', '2++3',
'2+++3', को ढूंढे, बाकी को नहीं।
एक स्ट्रिंग दी गई है:
txt = '*+ *q+ *qq+ *qqq+ *qqq qqq+'
एक रेगुलर एक्सप्रेशन लिखें, जो स्ट्रिंग्स
'*q+', '*qq+', '*qqq+',
को ढूंढे, बाकी को नहीं।
एक स्ट्रिंग दी गई है:
txt = '[abc] {abc} abc (abc) [abc]'
एक रेगुलर एक्सप्रेशन लिखें, जो वर्गाकार कोष्ठकों वाली
स्ट्रिंग्स को ढूंढे और उन्हें
'!' से बदल दे।