नियमित अभिव्यक्ति से पहले एक आर चरित्र खोज करने के लिए कॉल में बताता है() निर्दिष्ट करता है कि नियमित अभिव्यक्ति एक कच्ची स्ट्रिंग है। यह बैकस्लाश को नियमित अभिव्यक्ति में अक्षरों के बचने के क्रम के बजाय नियमित वर्णों के रूप में उपयोग करने की अनुमति देता है। मुझे समझाएं ...
पुन: मॉड्यूल की खोज विधि से पहले तारों को संसाधित करने से पहले, पाइथन दुभाषिया स्ट्रिंग पर प्रारंभिक पास लेता है। यदि स्ट्रिंग में बैकस्लाश मौजूद हैं, तो पाइथन दुभाषिया को यह तय करना होगा कि प्रत्येक पाइथन एस्केप अनुक्रम (उदा। \ N या \ t) का हिस्सा है या नहीं।
नोट: इस बिंदु पर पाइथन परवाह नहीं है कि नियमित रूप से अभिव्यक्ति मेटा-कैरेक्टर है या नहीं।
यदि '\' के बाद एक मान्यता प्राप्त पायथन बचने वाला चरित्र (टी, एन, इत्यादि) है, तो बैकस्लैश और बचने वाले चरित्र को वास्तविक यूनिकोड या 8-बिट वर्ण के साथ प्रतिस्थापित किया जाता है। उदाहरण के लिए, '\ t' को टैब के लिए ASCII वर्ण के साथ प्रतिस्थापित किया जाएगा। अन्यथा इसे '\' चरित्र के रूप में पारित किया जाता है।
निम्नलिखित पर विचार करें।
>>> s = '\t'
>>> print ("[" + s + "]")
>>> [ ] // an actual tab character after preprocessing
>>> s = '\d'
>>> print ("[" + s + "]")
>>> [\d] // '\d' after preprocessing
कभी कभी हम एक स्ट्रिंग में एक चरित्र अनुक्रम कि शामिल शामिल करना चाहते हैं '\' के बिना यह एक भागने अनुक्रम के रूप में अजगर से व्याख्या की जा रही। ऐसा करने के लिए हम '\' से '\' से बचते हैं। अब जब पाइथन '\' देखता है तो यह दो बैकस्लाश को एक '\' वर्ण से बदल देता है।
>>> s = '\\t'
>>> print ("[" + s + "]")
>>> [\t] // '\t' after preprocessing
पाइथन दुभाषिया दोनों तारों पर एक पास ले जाने के बाद, वे फिर से मॉड्यूल की खोज विधि में पास हो जाते हैं। खोज विधि नियमित अभिव्यक्ति के मेटा-वर्णों की पहचान करने के लिए नियमित अभिव्यक्ति स्ट्रिंग को पार करती है।
अब '\' एक नियमित नियमित अभिव्यक्ति मेटा-कैरेक्टर भी है और इसे एक संयुक्त के रूप में व्याख्या किया जाता है, जब उस समय से खोज() विधि निष्पादित की जाती है।
निम्नलिखित कॉल पर विचार करें।
>>> match = re.search('a\\t','a\\t') //Match is None
यहां, मैच कोई नहीं है। क्यूं कर? पाइथन दुभाषिया अपना पास करने के बाद तारों को देखने दें।
String 1: 'a\t'
String 2: 'a\t'
तो मैच किसी के बराबर क्यों नहीं है?जब खोज() स्ट्रिंग 1 का व्याख्या करती है, क्योंकि यह एक नियमित अभिव्यक्ति है, बैकस्लैश को मेटा-कैरेक्टर के रूप में व्याख्या किया जाता है, न कि सामान्य चरित्र। स्ट्रिंग 2 में बैकस्लैश नियमित अभिव्यक्ति में नहीं है और इसे पहले ही पाइथन दुभाषिया द्वारा संसाधित किया गया है, इसलिए इसे सामान्य चरित्र के रूप में व्याख्या किया जाता है।
तो खोज() विधि स्ट्रिंग 'ए \ टी' में 'एस्केप-टी' की तलाश में है जो एक मैच नहीं है।
इसे ठीक करने के लिए हम खोज() विधि को मेटा-कैरेक्टर के रूप में '\' की व्याख्या नहीं करने के लिए बता सकते हैं। हम इसे से बचकर ऐसा कर सकते हैं।
निम्नलिखित कॉल पर विचार करें।
>>> match = re.search('a\\\\t','a\\t') // Match contains 'a\t'
फिर, पाइथन दुभाषिया के पास होने के बाद तारों को देखने दें।
String 1: 'a\\t'
String 2: 'a\t'
अब जब खोज() विधि नियमित अभिव्यक्ति संसाधित करता है, यह देखता है कि दूसरे बैकस्लैश पहले से बच रहा है और एक मेटा-चरित्र नहीं माना जाना चाहिए। इसलिए यह स्ट्रिंग को 'ए \ टी' के रूप में व्याख्या करता है, जो स्ट्रिंग 2 से मेल खाता है।
खोज के लिए वैकल्पिक तरीका है() एक चरित्र के रूप में '\' को नियमित अभिव्यक्ति से पहले आर को रखना है। यह पायथन दुभाषिया को स्ट्रिंग को प्रीप्रोसेस नहीं करने के लिए कहता है।
इस पर विचार करें।
>>> match = re.search(r'a\\t','a\\t') // match contains 'a\t'
यहां पाइथन दुभाषिया पहली स्ट्रिंग को संशोधित नहीं करता है लेकिन दूसरी स्ट्रिंग को संसाधित करता है। तार खोज करने के लिए पारित कर दिया() कर रहे हैं:
String 1: 'a\\t'
String 2: 'a\t'
पिछले उदाहरण में के रूप में, खोज की व्याख्या एकल वर्ण '\' और नहीं एक मेटा-चरित्र के रूप में '\', इस प्रकार स्ट्रिंग 2.
से मेल खाता है
http://stackoverflow.com/questions/24085680/why-do-backslashes-appear-twice – fghj
संभावित डुप्लिकेट [regex के साथ बैकस्लैश से बच नहीं सकते?] (Https://stackoverflow.com/questions/4025482/ cant-escape-the-backslash-with-regex) – tripleee