剥去任何不是字符的unicode文本

时间:2012-12-18 18:25:37

标签: python unicode

我正在尝试编写一个简单的Python脚本,它将文本文件作为输入,删除每个非文字字符,并将输出写入另一个文件。 通常我会做两种方式:

  • 使用正则表达式与re.sub结合使用空字符串替换每个非字母字符
  • 检查每一行中的每个字符,只有在string.lowercase
  • 中才将其写入输出

但这次的文字是意大利语中的神曲(我是意大利语),所以有一些像

这样的Unicode字符
èéï

和其他一些人。我写了# -*- coding: utf-8 -*-作为脚本的第一行,但我得到的是,当在脚本中写入Unicode字符时,Python不会发出错误信号。

然后我尝试在我的正则表达式中包含Unicode字符,例如:

u'\u00AB'

它似乎有效,但是当从文件中读取输入时,Python不会像读取它一样重写它所读取的内容。例如,某些字符会转换为平方根符号。

我该怎么办?

2 个答案:

答案 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.将按照您的文件中的说明给您。

希望它会帮助你:)