如何在Python中使用德语变音符号

时间:2017-10-18 19:45:07

标签: python utf-8 python-3.6

我有一个带有德语短语的文本文件,我试图删除非字母字符,而不删除变音字符。我已经看过其他类似的问题,但这些解决方案似乎都不适用于我。在某些情况下,Python似乎认为变音字符是两个字符,但打印功能正常工作:

>>> ch = '\xc3\xbc'
>>> print(ch)
ü
>>> print(len(ch))
2
>>> print(list(ch))
['\xc3', '\xbc']

我删除非字母字符的代码是

import unicodedata
def strip_po(s):
    ''.join(x for x in s if unicodedata.category(x) != 'Po')
word = strip_po(word)

Traceback (most recent call last):
File "/home/ed/Desktop/Deutsch/test", line 17, in <module>
  word = strip_po(word)
File "/home/ed/Desktop/Deutsch/test", line 9, in strip_po
  ''.join(x for x in s if unicodedata.category(x) != 'Po')
File "/home/ed/Desktop/Deutsch/test", line 9, in <genexpr>
  ''.join(x for x in s if unicodedata.category(x) != 'Po')
TypeError: category() argument 1 must be unicode, not str

1 个答案:

答案 0 :(得分:3)

我将假设您在此场景中使用Python2,因为我可以使用Py2重新创建您的问题。

您不希望使用字节进行任何文本处理。 Python 2 str类型实际上只是一个字节列表,这就是len说你的字符长2个字节的原因。您希望将这些字节转换为unicode类型。你可以这样做:

In [1]: '\xc3\xbc'.decode('utf8')
Out[1]: u'\xfc'

注意在其上运行len将产生1,因为它现在只是一个unicode字符。现在您可以正常处理文本,并且该角色: unicodedata.category(u'\xfc')属于'Ll'

类别

您可能希望隐藏更多类别,而不仅仅是Po。这里有一个完整的列表: https://en.wikipedia.org/wiki/Unicode_character_property

Python的内置isalpha方法可以为您提供帮助,但您希望首先使用unicode类型,如上所示。 https://docs.python.org/2/library/stdtypes.html#str.isalpha

In [2]: u'\xfc'.isalpha()
Out[2]: True