Pythonには、正規表現で特殊文字をエスケープするために使用できる関数がありますか?
たとえば、I'm "stuck" :\
はI\'m \"stuck\" :\\
になります。
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)
すべての非英数字をバックスラッシュで囲んだ文字列を返します。これは、正規表現のメタ文字が含まれている可能性のある任意のリテラル文字列に一致させる場合に便利です。
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もエスケープする必要があります。([\"])
。そのため、substitutionパターンは、その前に\
を追加するときに、見つかった文字を使用できます。 (それが\1
が行うことです:最初の括弧で囲まれたグループの値を使用します。)r'([\"])'
の前にあるr
は、それがraw文字列であることを意味します。生の文字列は、バックスラッシュをエスケープするために異なるルールを使用します。 ([\"])
をプレーンな文字列として書くには、すべてのバックスラッシュを2つ重ねて'([\\"])'
と書く必要があります。生の文字列は、正規表現を作成するときに使いやすくなります。\
をエスケープして、置換グループの前にあるバックスラッシュと区別する必要があります。 \1
、したがってr'\\\1'
。 thatをプレーンな文字列として書くには、'\\\\\\1'
—が必要で、誰もそれを望んでいません。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" :\\'
上記で述べたように、答えはあなたのケースによって異なります。正規表現の文字列をエスケープする場合は、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\" :\\
そんなに難しくない:
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\" :\
一部の文字のみを置換する場合は、これを使用できます。
import re
print re.sub(r'([\.\\\+\*\?\[\^\]\$\(\)\{\}\!\<\>\|\:\-])', r'\\\1', "example string.")