我有一个带有德语短语的文本文件,我试图删除非字母字符,而不删除变音字符。我已经看过其他类似的问题,但这些解决方案似乎都不适用于我。在某些情况下,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
答案 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