有时当我从文件或用户那里获得输入时,我会得到一个包含转义序列的字符串.我想以与Python处理字符串文字中的转义序列相同的方式处理转义序列.
例如,假设myString定义为:
>>> myString = "spam\\neggs"
>>> print(myString)
spam\neggs
Run Code Online (Sandbox Code Playgroud)
我想要一个函数(我会称之为process)这样做:
>>> print(process(myString))
spam
eggs
Run Code Online (Sandbox Code Playgroud)
重要的是该函数可以处理Python中的所有转义序列(在上面链接的表中列出).
Python有功能吗?
我需要在复杂的字符串\\中用\python3 替换.我知道这个问题已被多次询问过,但大部分时间都是针对简单的字符串,所以(接受的)答案都不适用于复杂的字符串.
这也是不同的,从这个地方的问题可以用来解决.decode('unicode_escape')这对于这个问题无法正常工作.见下文.
假设字符串是:
my_str = '\\xa5\\xc0\\xe6aK\\xf9\\x80\\xb1\\xc8*\x01\x12$\\xfbp\x1e(4\\xd6{;Z\\x'
Run Code Online (Sandbox Code Playgroud)
直接的方法是:
my_str.replace('\\','\')
Run Code Online (Sandbox Code Playgroud)
这导致:
SyntaxError:扫描字符串文字时的EOL
这个答案建议使用:
my_str.replace('\\\\','\\')
Run Code Online (Sandbox Code Playgroud)
结果如下:
'\\xa5\\xc0\\xe6aK\\xf9\\x80\\xb1\\xc8*\x01\x12$\\xfbp\x1e(4\\xd6{;Z\\x'
Run Code Online (Sandbox Code Playgroud)
所以,没有变化.
这个答案表明:
b = bytes(my_str, encoding='utf-8')
b.decode('unicode-escape')
Run Code Online (Sandbox Code Playgroud)
但是这对于这样一个复杂的字符串不起作用:
UnicodeDecodeError:'unicodeescape'编解码器无法解码位置49-50中的字节:截断\ xXX转义
使用解码(如此处所示)会导致:
my_str.decode('unicode_escape')
Run Code Online (Sandbox Code Playgroud)
AttributeError:'my_str'对象没有属性'decode'
编码和解码的组合使用unicode_esacpe返回一个完全不同的字符串(可能是由于使用utf-16,但utf-8导致错误,见上文.另外,例如latin1,不起作用):
my_str.encode('utf-16').decode('unicode_escape')
'ÿþ\\\x00x\x00a\x005\x00\\\x00x\x00c\x000\x00\\\x00x\x00e\x006\x00a\x00K\x00\\\x00x\x00f\x009\x00\\\x00x\x008\x000\x00\\\x00x\x00b\x001\x00\\\x00x\x00c\x008\x00*\x00\x01\x00\x12\x00$\x00\\\x00x\x00f\x00b\x00p\x00\x1e\x00(\x004\x00\\\x00x\x00d\x006\x00{\x00;\x00Z\x00\\\x00x\x00'
Run Code Online (Sandbox Code Playgroud)
有类似的问题,但解决方案似乎不起作用.
说我编码了一个字符串:
>>> a = 'dada??'.encode('utf-8')
>>> type(a)
<class 'bytes'>
>>> a
>>> b'dada\xe5\xa4\xa7\xe5\xa4\xa7'
Run Code Online (Sandbox Code Playgroud)
我想要的是这样的:
dada\xe5\xa4\xa7\xe5\xa4\xa7
Run Code Online (Sandbox Code Playgroud)
str(a) 不起作用:
>>> str(a)
>>> "b'dada\\xe5\\xa4\\xa7\\xe5\\xa4\\xa7'"
Run Code Online (Sandbox Code Playgroud)
我已经尝试将stdout重定向到一个变量,但仍然,我得到了"b'dada\\xe5\\xa4\\xa7\\xe5\\xa4\\xa7'".
我可以使用正则表达式处理它并获得我想要的东西,但我正在寻找一种更加pythonic的方法来做到这一点.有什么建议?