4

特定の文字の文字列にエスケープ シーケンスを挿入する必要があります (ここでは例として二重引用符を使用しています)。たとえば、 string がある場合、abra"cada"braこれを生成する必要があります: abra\"cada\"bra。しかし、関心のあるリテラル (つまり、この例では二重引用符) のエスケープ文字が文字列に既に含まれている場合は、そのabra\"cada\"braままにしておく必要があります。Pythonでそれを行う最も簡単な方法は何ですか?

(アイデアは、別のユーティリティによって読み取られるテキスト ファイルに書き込むことです。)

4

5 に答える 5

2

最初に文字列をデコードして何もエスケープしないようにしてから、結果の文字列を再度エスケープするのがおそらく最も簡単です。

于 2013-03-08T16:11:56.760 に答える
1

正規表現のアサーションの背後にある適切な否定的なルックで取得できます。

import re

PAT = re.compile(r'(?<!\\)"')
txt1 = '"abra"cada"bra'
txt2 = '\\"abra\\"cada\\"bra'
print PAT.sub(r'\\"', txt1)
print PAT.sub(r'\\"', txt2)

これにより、上記の例のように、引用符が文字列の最初の文字である場合でも、正しく機能することが保証されます。

于 2013-03-08T16:23:05.393 に答える
1

このようなもの

def esc_string(mystring, delim, esc_char='\\'):
    return (esc_char+delim).join([s[:-1] if s.endswith(esc_char) else s for s in mystring.split(delim)])

それから

print esc_string('abra"cada"bra', '"')
abra\"cada\"bra
print esc_string('abra\\"cada\\"bra', '"')
abra\"cada\"bra
print esc_string('"boundary test"', '"')
\"boundary test\"
print esc_string('\\"boundary test\\"', '"')
\"boundary test\"
于 2013-03-08T16:27:11.783 に答える
1

特定の文字 (例: )\の直前以外に特別な意味がないと仮定すると、最初に unescape するという @chepner の提案は次のように実装できます。'"'

def escape(text, char='"', escape="\\"):
    escaped_char = escape + char
    text = text.replace(escaped_char, char) # unescape
    return text.replace(char, escaped_char) # escape

入力

"abra"cada"bra\"
\"abra\"cada\"bra"
"abra\"cada"bra\"
abra\"cada\\"bra\"
abra\"cada\\\"bra\"

出力

\"abra\"cada\"bra\"
\"abra\"cada\"bra\"
\"abra\"cada\"bra\"
abra\"cada\\"bra\"
abra\"cada\\\"bra\"
于 2013-03-08T17:23:44.637 に答える
0

正規表現はそれを行います。これは、バックスラッシュが前にない場合は " 文字に一致することを示しています。文字列の前に「r」を使用して、Python に「\」文字を特別に扱わないように指示しました。特別に使用しないように正規表現パーサーに伝えてください。(?

import re
re.sub(r'(?<!\\)"', r'\"', 'abra"cada\\"bra')
# Returns 'abra\\"cada\\"bra'
于 2013-03-08T16:22:53.393 に答える