对于某些字符,我需要将转义序列放入字符串中(此处以双引号为例)。例如,如果我有一个 string abra"cada"bra
,我需要生成这个:abra\"cada\"bra
。但是,如果字符串已经有我感兴趣的文字的转义字符(即本例中的双引号)abra\"cada\"bra
,我需要不理会它。在 python 中最简单的方法是什么?
(想法是将其写入另一个实用程序读取的文本文件。)
对于某些字符,我需要将转义序列放入字符串中(此处以双引号为例)。例如,如果我有一个 string abra"cada"bra
,我需要生成这个:abra\"cada\"bra
。但是,如果字符串已经有我感兴趣的文字的转义字符(即本例中的双引号)abra\"cada\"bra
,我需要不理会它。在 python 中最简单的方法是什么?
(想法是将其写入另一个实用程序读取的文本文件。)
首先解码字符串可能是最简单的,这样什么都不会被转义,然后重新转义得到的字符串。
假设\
除了紧接在某些字符(例如,'"'
)之前没有特殊含义,那么@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\"
您可以在正则表达式中的断言后面使用适当的否定外观来获得它:
import re
PAT = re.compile(r'(?<!\\)"')
txt1 = '"abra"cada"bra'
txt2 = '\\"abra\\"cada\\"bra'
print PAT.sub(r'\\"', txt1)
print PAT.sub(r'\\"', txt2)
如果引号是字符串的第一个字符,这将确保它甚至可以正常工作,如上例所示。
像这样的东西
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\"
正则表达式会做到这一点。如果它前面没有反斜杠,则表示匹配 " 字符。我在字符串的前面使用了一个 'r' 来告诉 python 不要特别处理 '\' 字符,我不得不将它放入两次以告诉正则表达式解析器不要专门使用它。试试 help(re) 什么 (?
import re
re.sub(r'(?<!\\)"', r'\"', 'abra"cada\\"bra')
# Returns 'abra\\"cada\\"bra'