我正在尝试编写一个简单的Python脚本,它将文本文件作为输入,删除每个非文字字符,并将输出写入另一个文件。 通常我会做两种方式:
re.sub
结合使用空字符串替换每个非字母字符string.lowercase
但这次的文字是意大利语中的神曲(我是意大利语),所以有一些像
这样的Unicode字符èéï
和其他一些人。我写了# -*- coding: utf-8 -*-
作为脚本的第一行,但我得到的是,当在脚本中写入Unicode字符时,Python不会发出错误信号。
然后我尝试在我的正则表达式中包含Unicode字符,例如:
u'\u00AB'
它似乎有效,但是当从文件中读取输入时,Python不会像读取它一样重写它所读取的内容。例如,某些字符会转换为平方根符号。
我该怎么办?
答案 0 :(得分:2)
unicodedata.category(unichr)
将返回该代码点的类别。
您可以在unicode.org找到类别的说明,但与您相关的类别是 L , N , P , Z 和 S 组:
Lu Uppercase_Letter an uppercase letter Ll Lowercase_Letter a lowercase letter Lt Titlecase_Letter a digraphic character, with first part uppercase Lm Modifier_Letter a modifier letter Lo Other_Letter other letters, including syllables and ideographs ...
您可能还想首先规范化您的字符串,以便可以附加到字母的变音符号这样做:
unicodedata.normalize(form, unistr)
返回Unicode字符串unistr的普通表单表单。表单的有效值为“NFC”,“NFKC”,“NFD”和“NFKD”。
把所有这些放在一起:
file_bytes = ... # However you read your input
file_text = file_bytes.decode('UTF-8')
normalized_text = unicodedata.normalize('NFC', file_text)
allowed_categories = set([
'Ll', 'Lu', 'Lt', 'Lm', 'Lo', # Letters
'Nd', 'Nl', # Digits
'Po', 'Ps', 'Pe', 'Pi', 'Pf', # Punctuation
'Zs' # Breaking spaces
])
filtered_text = ''.join(
[ch for ch in normalized_text
if unicodedata.category(ch) in allowed_categories])
filtered_bytes = filtered_text.encode('UTF-8') # ready to be written to a file
答案 1 :(得分:0)
import codecs
f = codecs.open('FILENAME', encoding='utf-8')
for line in f:
print repr(line)
print line
1。会给你Unicode形成
2.将按照您的文件中的说明给您。
希望它会帮助你:)