60

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

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

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

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

re.escape私が望むものではない二重エスケープ:

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

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

4

6 に答える 6

137

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

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

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

import re
escaped = re.escape(a_string)
于 2013-09-21T17:56:56.797 に答える
20

これが正規表現用であると仮定re.escapeて、 .

于 2013-09-21T17:57:03.567 に答える
5

の代わりにを使用するだけ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
于 2016-01-08T07:04:16.397 に答える
0

ビルトインの出力を利用して、出力をrepr処理\r\n\tおよび処理しre.escapeます。

re.escape(repr(a)[1:-1]).replace('\\\\', '\\')
于 2016-03-26T11:48:24.247 に答える