एक पायथन स्ट्रिंग में रेगेक्स विशेष पात्रों से बच


126

क्या पायथन में एक फ़ंक्शन है जो मैं नियमित अभिव्यक्ति में विशेष पात्रों से बचने के लिए उपयोग कर सकता हूं?

उदाहरण के लिए, I'm "stuck" :\बनना चाहिए I\'m \"stuck\" :\\


2
आप एक विशेष चरित्र को क्या मानते हैं?
पफकु

1
पूरी तरह से आपके संदर्भ पर निर्भर करता है। आमतौर पर वे पात्र पूरी तरह से ठीक होते हैं जब आप उन्हें एक स्ट्रिंग के अंदर रखते हैं।
पोक

जवाबों:


197

उपयोग re.escape

>>> import re
>>> re.escape(r'\ a.*$')
'\\\\\\ a\\.\\*\\$'
>>> print(re.escape(r'\ a.*$'))
\\\ a\.\*\$
>>> re.escape('www.stackoverflow.com')
'www\\.stackoverflow\\.com'
>>> print(re.escape('www.stackoverflow.com'))
www\.stackoverflow\.com

इसे यहाँ दोहरा रहे हैं:

re.escape (स्ट्रिंग)

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

अजगर के रूप में 3.7 re.escape()को केवल उन पात्रों से बचने के लिए बदल दिया गया था जो रेगेक्स संचालन के लिए सार्थक हैं।


1
आप पुनः के बजाय रेगेक्स मॉड्यूल का उपयोग कर सकते हैं। एक उदाहरण होगा regex.escape(pattern,string,special_only=True
लोकिनौ

17

मुझे आश्चर्य है कि किसी ने नियमित अभिव्यक्ति का उपयोग करके उल्लेख नहीं किया है re.sub():

import re
print re.sub(r'([\"])',    r'\\\1', 'it\'s "this"')  # it's \"this\"
print re.sub(r"([\'])",    r'\\\1', 'it\'s "this"')  # it\'s "this"
print re.sub(r'([\" \'])', r'\\\1', 'it\'s "this"')  # it\'s\ \"this\"

ध्यान देने योग्य महत्वपूर्ण बातें:

  • में खोज पैटर्न, शामिल \चरित्र (रों) आप देख रहे हैं और साथ ही। आप का उपयोग करने जा रहे हैं \तो आप से बचने के लिए की जरूरत है अपने पात्रों से बचने के लिए, कि अच्छी तरह से।
  • कोष्ठक खोज पैटर्न के आसपास रखें , उदाहरण के लिए ([\"]), ताकि प्रतिस्थापन पैटर्न पाया चरित्र का उपयोग कर सके जब वह इसके \सामने जोड़ता है। (यह वही \1करता है: पहले कोष्ठक समूह के मूल्य का उपयोग करता है।)
  • rके सामने r'([\"])'साधन यह एक है कच्चे स्ट्रिंग । कच्चे तार बैकस्लैश से बचने के लिए विभिन्न नियमों का उपयोग करते हैं। ([\"])एक सादे स्ट्रिंग के रूप में लिखने के लिए , आपको सभी बैकस्लैश को दोगुना करना होगा और लिखना होगा '([\\"])'। जब आप नियमित अभिव्यक्ति लिख रहे हैं तो कच्चे तार मित्रवत हैं।
  • में प्रतिस्थापन पैटर्न, आप से बचने के लिए की जरूरत है \एक बैकस्लैश कि एक प्रतिस्थापन समूह के पहले आता है, जैसे से अलग करने \1, इसलिए r'\\\1'। लिखने के लिए है कि एक सादे स्ट्रिंग के रूप में, आप आवश्यकता होगी '\\\\\\1'- और कोई भी नहीं चाहता।

9

Repr () [1: -1] का उपयोग करें। इस मामले में, दोहरे उद्धरण चिह्नों से बचने की आवश्यकता नहीं है। [-1: 1] टुकड़ा शुरुआत और अंत से एकल उद्धरण को हटाने के लिए है।

>>> x = raw_input()
I'm "stuck" :\
>>> print x
I'm "stuck" :\
>>> print repr(x)[1:-1]
I\'m "stuck" :\\

या हो सकता है कि आप सिर्फ अपने कार्यक्रम में पेस्ट करने के लिए एक वाक्यांश से बचना चाहते हैं? यदि हां, तो यह करें:

>>> raw_input()
I'm "stuck" :\
'I\'m "stuck" :\\'

3
यदि स्ट्रिंग यूनिकोड नहीं है तो यह काम नहीं करता है, क्योंकि आपके पास यू होगा और दौड़ना चाहिएrepr(x)[2:-1]
एंटोनी पेलिस

Python3.4 में, जहां सभी स्ट्रिंग्स यूनिकोड हैं, यह दुर्भाग्य से काम नहीं करता है। इसके बजाय, print(repr("I'm stuck")[1:-1])प्रिंट I'm stuck
डांस्टन 14

3

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

>>> escape = lambda s, escapechar, specialchars: "".join(escapechar + c if c in specialchars or c == escapechar else c for c in s)
>>> s = raw_input()
I'm "stuck" :\
>>> print s
I'm "stuck" :\
>>> print escape(s, "\\", ['"'])
I'm \"stuck\" :\\

1

यह इतना मुश्किल नही है:

def escapeSpecialCharacters ( text, characters ):
    for character in characters:
        text = text.replace( character, '\\' + character )
    return text

>>> escapeSpecialCharacters( 'I\'m "stuck" :\\', '\'"' )
'I\\\'m \\"stuck\\" :\\'
>>> print( _ )
I\'m \"stuck\" :\

3
यदि बैकस्लैश इसमें से एक है तो charactersबेहतर था कि वह पहले वाला हो!
स्टीवेहा

0

यदि आप केवल कुछ वर्णों को बदलना चाहते हैं जो आप इसका उपयोग कर सकते हैं:

import re

print re.sub(r'([\.\\\+\*\?\[\^\]\$\(\)\{\}\!\<\>\|\:\-])', r'\\\1', "example string.")
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.