有时,当我从文件或用户获得输入时,我会得到一个包含转义序列的字符串。我想处理转义序列in the same way that Python processes escape sequences in string literals。
例如,假设myString
定义为:
>>> myString = "spam\\neggs"
>>> print(myString)
spam\neggs
我想要一个函数(我称它为process
)来做这件事:
>>> print(process(myString))
spam
eggs
重要的是,该函数可以处理Python中的所有转义序列(在上面的链接中的表中列出)。
Python有做这件事的函数吗?
发布于 2010-10-26 13:01:32
正确的做法是使用字符串转义代码对字符串进行解码。
>>> myString = "spam\\neggs"
>>> decoded_string = bytes(myString, "utf-8").decode("unicode_escape") # python3
>>> decoded_string = myString.decode('string_escape') # python2
>>> print(decoded_string)
spam
eggs
不要使用AST或eval。使用字符串编解码器要安全得多。
发布于 2010-10-26 11:50:07
ast.literal_eval
函数很接近,但它希望字符串首先被正确地引起来。
当然,Python对反斜杠转义的解释取决于字符串的引号方式(""
、r""
、u""
、三重引号等),因此您可能希望将用户输入括在适当的引号中,并将其传递给literal_eval
。将其括在引号中也可以防止literal_eval
返回数字、元组、字典等。
如果用户键入您想要在字符串两边环绕的类型的不带引号的引号,事情可能仍然很棘手。
发布于 2019-03-05 06:45:56
这是一种很糟糕的方式,但在我试图解释字符串参数中传递的转义八进制数时,它对我很有效。
input_string = eval('b"' + sys.argv[1] + '"')
值得一提的是,eval和ast.literal_eval是有区别的(eval更加不安全)。请参阅Using python's eval() vs. ast.literal_eval()?
https://stackoverflow.com/questions/4020539
复制相似问题