无法在特定场景中使用 unicodedata.normalize() 并且完全不知道为什么会发生这种情况

问题描述 投票:0回答:1

我遇到了一个问题,给定一个字符串,我想使用 unicodedata.normalize("NFKD",raw_data) 来删除我的数据清理器的特定问题点。然而我遇到了一个巨大的问题,我完全无法弄清楚,这似乎很矛盾。

我从这篇文章中得到了使用 unicodedata.normalize 函数的想法:标准化 Unicode

我认为这会起作用:

raw_data = unicodedata.normalize("NFKD",raw_data)

为了尝试解决问题,我想也许对于每一行我都可以应用标准化,我想也许我的字符串太大了!所以我逐行查看,发现这与字符串的长度无关。我想也许该命令不起作用。我在新窗口中亲自测试了这一点,然后运行了 python。

当我导入 unicodedata 并输入以下行时: unicodedata.normalize("NFKD","清洁冰淇淋机 –\xa0使用湿布或海绵擦拭冰淇淋机的外部和内部,以去除灰尘或污垢。")

输出为:“清洁冰淇淋机 - 使用湿布或海绵擦拭冰淇淋机的外部和内部,以去除灰尘或污垢。” - 正是我想要的!

我会将问题分解为任何用户都可以重现的场景:

假设 raw_data = " 1. 清洁冰淇淋机 –\xa0使用湿布或海绵擦拭冰淇淋机的外部和内部,以去除灰尘或污垢。”(使用 pandas 模块和 gspread 摘自 google 表格)。

然后我会采用这个 raw_data 字符串(通常包含很多很多行 和列表)并创建每行的列表。 (将此列表称为 input_lines)将通过“分割字符串来定义” “。这就是我的问题发生时的代码:

for line in input_lines[0]:
    print(line)
    print(unicodedata.normalize("NFKD",line))
    if line != unicodedata.normalize("NFKD",line):
........

此 input_lines 列表包含“1. 清洁冰淇淋机 –\xa0使用湿布或海绵擦拭冰淇淋机的外部和内部,以去除灰尘或污垢。”。

但是,当需要评估时: line =“1.清洁冰淇淋机 –\xa0使用湿布或海绵擦拭冰淇淋机的外部和内部,以去除灰尘或污垢。”

print(line) = "1. 清洁冰淇淋机 –\xa0使用湿布或海绵擦拭冰淇淋机的外部和内部,以去除灰尘或污垢。"

print(unicodedata.normalize("NFKD",line)) = "1. 清洁冰淇淋机 –\xa0使用湿布或海绵擦拭冰淇淋机的外部和内部,以去除灰尘或污垢。"

但是,如果我只是手动将此字符串放入函数中:

print(unicodedata.normalize("NFKD","1. 清洁冰淇淋机 –\xa0使用湿布或海绵擦拭冰淇淋机的外部和内部,以去除灰尘或污垢。")) = " 1. 清洁冰淇淋机 – 用湿布或海绵擦拭冰淇淋机的外部和内部,以去除灰尘或污垢。”

我已尽一切努力来解决这个问题,我从根本上不明白这里发生了什么,它似乎正在消耗我的灵魂,所以任何帮助将不胜感激。

要回答评论中的问题,当我在 line = "1. 清洁冰淇淋机时执行 repr(line) –\xa0 使用湿布或海绵擦拭冰淇淋机的外部和内部以去除灰尘或污垢”。在for循环中,结果是:

  1. 清洁冰淇淋机 –\xa0使用湿布或海绵擦拭冰淇淋机的外部和内部,以去除灰尘或污垢。
python python-3.x unicode python-unicode
1个回答
0
投票

感谢评论中 Michael Ruth 的帮助,我自己解决了这个问题。

我只是使用 .find 函数找到了 unicode 转义序列的位置,并通过遵循语法的预期值进行偏移:

line = line[:line.find("\\x")] + line[line.find("\\x")+4:]

我也使用相同的逻辑对 unicode 组合执行了此操作:

line = line[:line.find("\\u")] + line[line.find("\\u"+6):]
© www.soinside.com 2019 - 2024. All rights reserved.