web-dev-qa-db-ja.com

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

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

たとえば、I'm "stuck" :\I\'m \"stuck\" :\\になります。

107
Wolfy

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)

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

174
pyfunc

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\"

注意すべき重要事項:

  • 検索パターンには、\と探している文字を含めます。 \を使用して文字をエスケープするため、thatもエスケープする必要があります。
  • searchパターンを括弧で囲みます。 ([\"])。そのため、substitutionパターンは、その前に\を追加するときに、見つかった文字を使用できます。 (それが\1が行うことです:最初の括弧で囲まれたグループの値を使用します。)
  • r'([\"])'の前にあるrは、それがraw文字列であることを意味します。生の文字列は、バックスラッシュをエスケープするために異なるルールを使用します。 ([\"])をプレーンな文字列として書くには、すべてのバックスラッシュを2つ重ねて'([\\"])'と書く必要があります。生の文字列は、正規表現を作成するときに使いやすくなります。
  • substitutionパターンでは、\をエスケープして、置換グループの前にあるバックスラッシュと区別する必要があります。 \1、したがってr'\\\1'thatをプレーンな文字列として書くには、'\\\\\\1' —が必要で、誰もそれを望んでいません。
17
Tim Ruddick

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" :\\'
10
dp_

上記で述べたように、答えはあなたのケースによって異なります。正規表現の文字列をエスケープする場合は、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\" :\\
3
spatar

そんなに難しくない:

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\" :\
2
poke

一部の文字のみを置換する場合は、これを使用できます。

import re

print re.sub(r'([\.\\\+\*\?\[\^\]\$\(\)\{\}\!\<\>\|\:\-])', r'\\\1', "example string.")
2