我需要在字符串中为某些字符(这里以双引号为例)放置转义序列。例如,如果我有一个字符串 "abra"cada"bra",我需要生成这个字符串:abra\"cada\"bra。但是,如果字符串已经具有我感兴趣的文字的转义字符(例如,在这个例子中是双引号) abra\"cada\"bra,我需要保持不变。
在Python中最简单的方法是什么?
(想法是将其写入由另一个实用程序读取的文本文件中。)
在Python中最简单的方法是什么?
(想法是将其写入由另一个实用程序读取的文本文件中。)
最好先解码字符串,这样就不会有任何转义内容,然后再重新转义结果字符串。
import re
PAT = re.compile(r'(?<!\\)"')
txt1 = '"abra"cada"bra'
txt2 = '\\"abra\\"cada\\"bra'
print PAT.sub(r'\\"', txt1)
print PAT.sub(r'\\"', txt2)
e,c ='\\"';print re.sub(r"(?<!{}){}".format(*map(re.escape,[e,c])), (e+c).encode('string-escape'), r'a"b\"c')
。相关问题链接。 - jfs像这样的东西
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\"
\
除了在某些字符(如'"'
)之前没有特殊含义,那么@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\"
Regular expressions will do it. This one says to match the " character if it is not preceded by a backslash. I used an 'r' at the front of the strings to tell python not to treat the '\' character specially and I had to put it in twice to tell the regular expression parser not to use it specially. Try help(re) for what the (?
import re
re.sub(r'(?<!\\)"', r'\"', 'abra"cada\\"bra')
# Returns 'abra\\"cada\\"bra'
'"'
只是一个例子)。考虑如果使用'1'
而不是'"'
会发生什么。 - jfsr'(?<!\\)["1x]'
将转义 " 1 和 x。 - tdelaneyre.sub()
的第二个参数,其中 \1
具有特殊含义。使用单个 re.sub()
实现 escape(text, char)
很困难。 - jfsre.sub
的repl
参数,最后是问题中的规则。 - jfs
abra\\"cada\\"bra
? - jfs