蟒蛇。将“ \\ uxxxx”替换为“ \ uxxxx”

时间:2018-09-21 06:09:34

标签: python regex unicode replace

我正在抓取网络,并且得到了Unicode字符作为原始字符。 我得到\u00f3而不是得到“ó”字符。

与写相同:

>>>print("\\u00f3")

我想将所有Unicode字符中的"\\u00f3"转换为"\u00f3"。是:

"\\uxxxx" -> "\uxxxx"

但是,如果我尝试将\\替换为\,则下一个字符将被解释为转义字符。

我该怎么办?


应用下面的代码,我可以转换部分字符:

def raw_to_utf8(matcher): 
    string2convert = matcher.group(0)
    return(chr(int(string2convert[2:],base=16)))

def decode_utf8(text_raw):
   text_raw_re=re.compile(r"\\u[0-9a-ce-z]\w{0,3}")
   return text_raw_re.sub(raw_to_utf8, text_raw)

text_fixed = decode_utf8(text_raw)

正如您在正则表达式模式中所看到的,我已经跳过了'd'字符。这是因为该方法和任何其他方法都不能在UTF-8中转换\ udxxx字符。对于我来说,它们不是重要角色,所以这不是问题。

感谢您的帮助。

****************************解决了********************** ************

最佳解决方案之前已解决: Python-encoding and decoding using codecs,unicode_escape()

感谢您的帮助。

2 个答案:

答案 0 :(得分:0)

首先:也许您未使用正确的字符集对网页进行解码。如果Web服务器不提供字符集,则可能必须在meta标记中找到它或进行有根据的猜测。也许尝试几个常用的字符集并比较结果。

第二:我玩了一段时间的字符串并解码了一段时间,这确实令人沮丧,但是我在format()中找到了可能的解决方案:

s = "\\u00f3"
print('{:c}'.format(int(s[2:], 16)))

将提取的十六进制值格式化为Unicode似乎可以正常工作。

答案 1 :(得分:0)

您不能将' @ error/constitute.c/ReadImage/509.convert: unable to open image 'roti': No such file or directory @ error/blob.c/OpenBlob/3094.convert: no decode delegate for this image format替换为'\\',因为'\'不是有效的文字字符串。

将十六进制表达式转换为数字,然后找到相应的字符:

'\'

您可以检查一下是否可以得到所需的结果:

original = '\\u00f3'
char = chr(int(original[2:], base=16))