如何在字符串中添加/替换/删除转义字符 - Python

时间:2017-11-27 18:54:06

标签: python string encoding utf-8 byte

我在转义字符方面遇到了一些问题。

问题我:

我有一个字符串形式:

String = "%C3%85"

String是UTF-8中两个字节的表示,用于编码此字符:“Å”。 除外:“\ x”替换为“%”。

所以我想改变 String 看起来像这样:

String = "\xC3\x85"

问题II:

表格中有一个字符串:

*String* = "\\x33"

现在我想将其转换为UTF-8字节表示形式,如下所示:

String = b"\x33"

我该怎么做?

我试过的方法:

我尝试使用替换方法:

string.replace("%","\")  -- wont work since \ escapes "
string.replace("%","\\") -- wont work since this produces problem II
string.replace("%","\x00").replace("00","") -- wont work since "\x00" is a char by its own.

bytes(string.replace("%","\\") ) -- wont work since this basically comes down to problem II

一种有效的方法,但似乎需要更多的工作是创建一个包含以下形式的所有字符的字典:

"%00" = "\x00"
...
...

但是......这应该是自动化的,因为它基本上只是用x \

替换%

我运气不好,无法在互联网上找到任何帮助。

lmgtfy也不会帮助我;)

感谢您的帮助!

2 个答案:

答案 0 :(得分:1)

这两个问题都可以通过标准库解决。

问题我看起来像URL-Encoding,即。您在浏览器的地址栏中查询字符串中看到的那种“乱码”。 在Python 3中,urllib模块可以处理:

>>> import urllib.parse
>>> urllib.parse.unquote('%C3%85')
'Å'

对于问题II,您似乎具有转义序列,因为它们在Python的字符串文字中使用。 您可能知道,您可以在源代码中键入'å''\xe5'以获得完全相同的字符串,就像您可以键入0.1.1或{{1获取相同的浮点值。 由于Python解释器在源代码中看到了四个字符1e-1\xe,因此必须有一种方法将此序列转换为字符{{ 1}}。并且(部分)此算法通过“unicode_escape”编解码器提供给Python程序员,您可以使用“正常”编解码器,如“utf-8”:

5

由于Python 3的å类型没有>>> '\\x33'.encode('ascii').decode('unicode_escape') '3' 方法,因此必须先将其编码为字节。 如果您的输入仅包含ASCII字符,则上述行有效;对于拉丁语-1字符和str转义的混合,也可以使用“latin-1”。

答案 1 :(得分:0)

问题是你有十六进制编码字符字节数组的字符串表示。您需要将其从字符串转换为十六进制,然后让Python将其解释为UTF-8字符编码。试试这个:

import re 

String = "%C3%85"
out = bytearray(int(c, 16) for c in re.findall(r'%(\w\w)', String)).decode('utf8')
out
# returns:
'Å'

对于第二部分,'\x33'的二进制表示为b'3'。要从字符串'\\x33'获取到b'3',您需要删除字符串格式,将字符串字符转换为十六进制,然后转换为字节。

String = '\\x33'
out = bytes(int(c, 16) for c in re.findall(r'\\x(\w\w)', String))
out
# returns:
b'3'