web-dev-qa-db-ja.com

単一のバックスラッシュで文字列の特殊文字をエスケープする方法

私は文字-]\^$*.をそれぞれ単一のバックスラッシュ\でエスケープしようとしています。

たとえば、文字列:^stack.*/overflo\w$arr=1は次のようになります。

\^stack\.\*/overflo\\w\$arr=1

Pythonでこれを行う最も効率的な方法は何ですか?

re.escapeダブルエスケープは、私が望むものではありません:

'\\^stack\\.\\*\\/overflow\\$arr\\=1'

他の何か(nginx)のためにエスケープするにはこれが必要です。

37
Tom

これはそれを行う1つの方法です(Python 3.xで):

escaped = a_string.translate(str.maketrans({"-":  r"\-",
                                          "]":  r"\]",
                                          "\\": r"\\",
                                          "^":  r"\^",
                                          "$":  r"\$",
                                          "*":  r"\*",
                                          ".":  r"\."}))

参照用に、正規表現で使用する文字列をエスケープするには:

import re
escaped = re.escape(a_string)
79
rlms

ちょうどassumingこれは正規表現用で、 re.escape を使用します。

12
Ry-

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
>>>
5
rjmunro

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
5
Akshay Hazari

組み込みのreprの出力を利用して\r\n\tを処理し、re.escapeの出力を処理します:

re.escape(repr(a)[1:-1]).replace('\\\\', '\\')
2
cyining

組み込み関数repr()を使用して、すべてのバックスラッシュをエスケープするPython 3.7。*の\

repr('your_string')

リンクを確認してください: https://docs.python.org/3/library/functions.html#repr

0
Free Sadness