私は文字-]\^$*.
をそれぞれ単一のバックスラッシュ\
でエスケープしようとしています。
たとえば、文字列:^stack.*/overflo\w$arr=1
は次のようになります。
\^stack\.\*/overflo\\w\$arr=1
Pythonでこれを行う最も効率的な方法は何ですか?
re.escape
ダブルエスケープは、私が望むものではありません:
'\\^stack\\.\\*\\/overflow\\$arr\\=1'
他の何か(nginx)のためにエスケープするにはこれが必要です。
これはそれを行う1つの方法です(Python 3.xで):
escaped = a_string.translate(str.maketrans({"-": r"\-",
"]": r"\]",
"\\": r"\\",
"^": r"\^",
"$": r"\$",
"*": r"\*",
".": r"\."}))
参照用に、正規表現で使用する文字列をエスケープするには:
import re
escaped = re.escape(a_string)
ちょうどassumingこれは正規表現用で、 re.escape
を使用します。
re.escape
は二重にエスケープしません。 replで実行した場合のように見えます。エスケープの2番目のレイヤーは、画面への出力によって発生します。
Replを使用する場合は、print
を使用して、実際に文字列に含まれるものを確認してください。
$ python
>>> import re
>>> re.escape("\^stack\.\*/overflo\\w\$arr=1")
'\\\\\\^stack\\\\\\.\\\\\\*\\/overflo\\\\w\\\\\\$arr\\=1'
>>> print re.escape("\^stack\.\*/overflo\\w\$arr=1")
\\\^stack\\\.\\\*\/overflo\\w\\\$arr\=1
>>>
re.sub
の代わりにstr.maketrans
を使用するだけでも機能する場合があります。また、これはpython 2.xでも機能します。
>>> print(re.sub(r'(\-|\]|\^|\$|\*|\.|\\)',lambda m:{'-':'\-',']':'\]','\\':'\\\\','^':'\^','$':'\$','*':'\*','.':'\.'}[m.group()],"^stack.*/overflo\w$arr=1"))
\^stack\.\*/overflo\\w\$arr=1
組み込みのrepr
の出力を利用して\r\n\t
を処理し、re.escape
の出力を処理します:
re.escape(repr(a)[1:-1]).replace('\\\\', '\\')
組み込み関数repr()
を使用して、すべてのバックスラッシュをエスケープするPython 3.7。*の\
repr('your_string')
リンクを確認してください: https://docs.python.org/3/library/functions.html#repr