4

对于某些字符,我需要将转义序列放入字符串中(此处以双引号为例)。例如,如果我有一个 string abra"cada"bra,我需要生成这个:abra\"cada\"bra。但是,如果字符串已经有我感兴趣的文字的转义字符(即本例中的双引号)abra\"cada\"bra,我需要不理会它。在 python 中最简单的方法是什么?

(想法是将其写入另一个实用程序读取的文本文件。)

4

5 回答 5

2

首先解码字符串可能是最简单的,这样什么都不会被转义,然后重新转义得到的字符串。

于 2013-03-08T16:11:56.760 回答
1

假设\除了紧接在某些字符(例如,'"')之前没有特殊含义,那么@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 回答
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 回答
0

正则表达式会做到这一点。如果它前面没有反斜杠,则表示匹配 " 字符。我在字符串的前面使用了一个 'r' 来告诉 python 不要特别处理 '\' 字符,我不得不将它放入两次以告诉正则表达式解析器不要专门使用它。试试 help(re) 什么 (?

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