Python文字列の正規表現特殊文字をエスケープする


126

Pythonには、正規表現で特殊文字をエスケープするために使用できる関数がありますか?

たとえば、にI'm "stuck" :\なるはずI\'m \"stuck\" :\\です。


2
特別なキャラクターだと思いますか?
pafcu 2010年

1
完全にあなたのコンテキストに依存します。通常、これらの文字は、文字列内にある場合はまったく問題ありません。
2010年

回答:


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(string)

英数字以外のすべてのバックスラッシュを含む文字列を返します。これは、正規表現のメタ文字が含まれている可能性がある任意のリテラル文字列に一致させる場合に便利です。

Python 3.7以降re.escape()は、正規表現の操作で意味のある文字のみをエスケープするように変更されました。


1
reの代わりにregexモジュールを使用できます。例は次のようになります regex.escape(pattern,string,special_only=True
Lokinou

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'([\"])'それが生の文字列であることを意味します。生の文字列は、バックスラッシュをエスケープするために異なるルールを使用します。([\"])プレーンな文字列として書き込むには、すべてのバックスラッシュを2倍にしてを書き込む必要があります'([\\"])'。正規表現を記述している場合、生の文字列はより使いやすくなっています。
  • 置換パターン、あなたはエスケープする必要がある\など、置換グループの前にバックスラッシュと区別する\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
文字列がUnicodeの場合は機能しません。uが存在し、実行する必要があるためですrepr(x)[2:-1]
Antoine Pelisse

すべての文字列がユニコードであるpython3.4では、残念ながらこれはまったく機能しないようです。代わりに、をprint(repr("I'm stuck")[1:-1])印刷し I'm stuckます。
dantiston、2015年

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
バックスラッシュがその1つであるcharacters場合は、最初のスラッシュを使用することをお勧めします。
steveha

0

一部の文字のみを置き換えたい場合は、次のように使用できます。

import re

print re.sub(r'([\.\\\+\*\?\[\^\]\$\(\)\{\}\!\<\>\|\:\-])', r'\\\1', "example string.")
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.