【问题标题】:Unwanted bytes in the string字符串中不需要的字节
【发布时间】:2018-07-10 10:34:07
【问题描述】:

总结:

我正在尝试预处理文本以在之后进行分类或主题建模。问题是在预处理的时候,有些编码问题我解决不了,编码真的是个很麻烦的话题。

说明:

给定的字符串取自一个excel文件,

s = "  GEÇİCİ  \n\t"

现在,当我尝试对这个字符串应用一些替换和标记时,我遇到了字符串变成的问题,

print(re.sub(r'[^a-zıöüşçğ.,\']', ' ', s.lower()))
# '  geçi ci     '

结果不应该像那样分开,它会破坏我的标记化过程。然后我尝试了不区分大小写的方法,效果很好。

print(re.sub(r'[^a-zıöüşçğ.,\']', ' ', s, flags=re.I).lower())
# '  geçi̇ci̇    '

现在要了解哪里出了问题,我尝试将原始字符串编码为“utf-8”,这很好,

print(s.encode("utf-8"))
# b'  GE\xc3\x87\xc4\xb0C\xc4\xb0  \n\t'

但是当我尝试在使用 lower() 后对其进行编码时,问题就出在了这里,

print(s.lower().encode("utf-8"))
# b'  ge\xc3\xa7i\xcc\x87ci\xcc\x87  \n\t'

与预期结果进行比较

print("geçici".encode("utf-8"))
# b'ge\xc3\xa7ici'

问题:

这两个 b'\xcc\x87' 是从哪里来的?

我记得在 C# 中遇到过类似的问题。有一种像ToLowerInvariant 这样的方法绕过了这样的问题。寻找这样的参数,我可以传递给 lower 但没有出现。

【问题讨论】:

  • 您的预期结果是错误的:您假设 "İ".lower() == "i" (regular "i")
  • @bobrobbob 不应该是这样吗,那正确的做法是什么呢?
  • 当然不是。上面的“i”是“I”而不是“İ”
  • 这就是我真正要问的问题,我怎样才能避免这种情况来制作"İ".lower() == "i"

标签: python python-3.x encoding utf-8


【解决方案1】:

这两个 b'\xcc\x87' 低于İ。如果你想摆脱它们,用它更新你的正则表达式:r'[^a-zıi̇öüşçğ.,\']'。 i̇ 可能看起来像普通的低 i 位,但不是(请注意不在代码块中时的双点模式)

这是来自我的文本编辑器的不同变体的图片:dotless ı、dotless i̇ with dot、regular i

【讨论】:

  • 怎么样? i 不是已经包含在 a-z 中了吗?那么我在正则表达式中犯了错误吗?
  • 我接受这个作为答案,因为你把我引向了正确的方向。因此,我没有直接使用lower,而是将有问题的字符替换为相应的较低字符,然后我应用了lower
猜你喜欢
  • 1970-01-01
  • 2016-06-29
  • 1970-01-01
  • 2020-11-04
  • 2016-08-22
  • 2011-12-24
  • 1970-01-01
相关资源
最近更新 更多