使用Python 3.2解除字符串中转义字符的转义

7

假设我有一个Python 3.2中的字符串,像这样:

'\n'

当我将其打印到控制台时,它会显示为一个新行。显然,我想要的是能够字面上打印出反斜杠后跟着n。此外,我需要对所有转义字符进行这样的操作,例如\t。因此,我正在寻找一个名为unescape()的函数,通常情况下,它应该按照以下方式工作:

>>> s = '\n\t'
>>> print(unescape(s)) 
'\\n\\t'

在Python中,是否可以不构建转义字符到字面替换的字典来实现此操作?

(如果有人感兴趣,我之所以这样做是因为我需要将字符串传递给命令行上的外部程序。该程序理解所有标准转义序列。)


当你说“在命令行上”时,我认为你实际上是指通过stdout,这种情况下,你将数据传递给的程序应该消耗\n等等...没有任何问题。也就是说,如果你在将数据传递到第二个程序后打印它,你会看到\n仍然存在。除非你真的想要转义它。但首先检查一下,如果你只是在第二个程序中删除额外的\,那么你可能做错了。 - Endophage
我有一个命令行程序叫做myutility。它期望被这样调用: myutility -i \n 如果我不对字符串进行反转义,那么它将永远看不到传递给它的\n - 它会认为-i是一个空参数。 - Mike Chamberlain
2个回答

13
为了防止在字面字符串中特殊处理反斜杠字符\,你可以使用r前缀:

为了避免对字面字符串中的反斜杠字符\进行特殊处理,您可以使用r前缀:

s = r'\n'
print(s)
# -> \n

如果你有一个包含换行符号的字符串 (ord(s) == 10),并且你想将它转换成适合作为Python字面量的形式:

s = '\n'
s = s.encode('unicode-escape').decode()
print(s)
# -> \n

5

编辑:根据您最后的评论,您可能希望将Unicode转换为某种编码表示。以下是一种方法:

>>> s = '\n\t'
>>> s.encode('unicode-escape')
b'\\n\\t'

如果您不需要对它们进行转义,则可以使用系统编码,例如:

>>> s.encode('utf8')
b'\n\t'

您可以在子进程中使用它:
import subprocess
proc = subprocess.Popen([ 'myutility', '-i', s.encode('utf8') ], 
                        stdout=subprocess.PIPE, stdin=subprocess.PIPE, 
                        stderr=subprocess.STDOUT)
stdout,stderr = proc.communicate()

2
虽然 repr() 确实很吸引人,但这可能并不是确切的意图,因为它实际上会输出一个包含单引号的字符串,所以最终你会得到类似于 "'\\n\\r'" 的输出结果。 - voithos
我的Python将其评估为"'\n\t'",我猜我可以只剥离第一个和最后一个字符...? - Mike Chamberlain
1
repr('\n\t') 返回 "'\\n\\t'" - Oleh Prypin
注意:unicode-escaperepr 不同,它还会转义 ASCII 范围之外的字符,例如 变成 \u2295 - user202729

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接