文档章节

移除Python unicode字符串中的重音符号的最佳方法是什么?

 技术盛宴
发布于 01/23 21:37
字数 993
阅读 190
收藏 0

我在Python中有一个Unicode字符串,我想删除所有的重音符号(变音符号)。

我在网上发现了一种用Java实现此目的的优雅方法:

  1. 将Unicode字符串转换为长规范化格式(带有单独的字母和变音符号)
  2. 删除所有Unicode类型为“变音符号”的字符。

我是否需要安装pyICU之类的库,还是仅使用python标准库就可以? 那python 3呢?

重要说明:我想避免使用带有重音符号到非重音符号的显式映射的代码。


#1楼

这不仅处理重音,而且还处理“笔画”(如ø等):

import unicodedata as ud

def rmdiacritics(char):
    '''
    Return the base character of char, by "removing" any
    diacritics like accents or curls and strokes and the like.
    '''
    desc = ud.name(char)
    cutoff = desc.find(' WITH ')
    if cutoff != -1:
        desc = desc[:cutoff]
        try:
            char = ud.lookup(desc)
        except KeyError:
            pass  # removing "WITH ..." produced an invalid name
    return char

这是我能想到的最优雅的方式(alexis在此页的评论中已经提到),尽管我认为这确实不是很优雅。 实际上,正如注释中所指出的那样,这更像是一种黑客,因为Unicode名称是–实际上只是名称,因此它们不保证其一致性或任何形式。

由于它们的Unicode名称不包含“ WITH”,因此仍然有一些特殊的字母无法对此进行处理,例如转弯和倒转字母。 无论如何,这取决于您想做什么。 有时我需要重音符号来实现字典的排序顺序。

编辑说明:

合并了注释中的建议(处理查找错误,Python-3代码)。


#2楼

回应@MiniQuark的回答:

我正在尝试读取一个半法语的csv文件(包含重音符号)以及一些最终会变成整数和浮点数的字符串。 作为测试,我创建了一个test.txt文件,如下所示:

蒙特利尔,于伯,12.89,梅尔,弗朗索瓦,诺尔,889

我必须包括第2行和第3行才能使其正常工作(我在python票证中找到),并包含@Jabba的注释:

import sys 
reload(sys) 
sys.setdefaultencoding("utf-8")
import csv
import unicodedata

def remove_accents(input_str):
    nkfd_form = unicodedata.normalize('NFKD', unicode(input_str))
    return u"".join([c for c in nkfd_form if not unicodedata.combining(c)])

with open('test.txt') as f:
    read = csv.reader(f)
    for row in read:
        for element in row:
            print remove_accents(element)

结果:

Montreal
uber
12.89
Mere
Francoise
noel
889

(注意:我在Mac OS X 10.8.4上并使用Python 2.7.3)


#3楼

Unidecode是正确的答案。 它将所有unicode字符串音译为ASCII文本中最接近的可能表示形式。

例:

accented_string = u'Málaga'
# accented_string is of type 'unicode'
import unidecode
unaccented_string = unidecode.unidecode(accented_string)
# unaccented_string contains 'Malaga'and is of type 'str'

#4楼

实际上,我正在开发与项目兼容的python 2.6、2.7和3.4,并且必须从免费用户条目中创建ID。

多亏了您,我创建了一个可以实现奇迹的功能。

import re
import unicodedata

def strip_accents(text):
    """
    Strip accents from input String.

    :param text: The input string.
    :type text: String.

    :returns: The processed String.
    :rtype: String.
    """
    try:
        text = unicode(text, 'utf-8')
    except (TypeError, NameError): # unicode is a default on python 3 
        pass
    text = unicodedata.normalize('NFD', text)
    text = text.encode('ascii', 'ignore')
    text = text.decode("utf-8")
    return str(text)

def text_to_id(text):
    """
    Convert input text to id.

    :param text: The input string.
    :type text: String.

    :returns: The processed String.
    :rtype: String.
    """
    text = strip_accents(text.lower())
    text = re.sub('[ ]+', '_', text)
    text = re.sub('[^0-9a-zA-Z_-]', '', text)
    return text

结果:

text_to_id("Montréal, über, 12.89, Mère, Françoise, noël, 889")
>>> 'montreal_uber_1289_mere_francoise_noel_889'

#5楼

一些语言结合了变音符号作为语言字母和重音符号来指定重音。

我认为更明确地指定要去除的折光度数更安全:

def strip_accents(string, accents=('COMBINING ACUTE ACCENT', 'COMBINING GRAVE ACCENT', 'COMBINING TILDE')):
    accents = set(map(unicodedata.lookup, accents))
    chars = [c for c in unicodedata.normalize('NFD', string) if c not in accents]
    return unicodedata.normalize('NFC', ''.join(chars))

本文转载自:https://stackoom.com/question/2Ajb/移除Python-unicode字符串中的重音符号的最佳方法是什么

粉丝 0
博文 1231
码字总数 0
作品 0
深圳
高级程序员
私信 提问
加载中

评论(0)

PHP V5.3 在 Unicode 方面有何新特性?

PHP 是一种十分流行的语言,但仍然缺少适当的 Unicode 支持。不过最新发布的 V5.3 添加了一个构建于著名的 ICU 库之上的新的国际化库。现在,利用这个新库,就可以适当地对多个本地语言环境的...

小编辑
2010/01/29
460
2
Python 2 与 Python 3 的差异对比

这篇文章总结了一些与Python2.6相比Python3.0中的新特性.Python3是一个不向后兼容的版本,有了很多的改变,这些对于Python开发者来说是非常重要的,虽然多数人说Python3真正流行起来还需要一...

大数据之路
2013/11/02
7.3K
1
Python 编码为什么那么蛋疼?

据说,每个做 Python 开发的都被字符编码的问题搞晕过,最常见的错误就是 UnicodeEncodeError、UnicodeDecodeError,你好像知道怎么解决,遗憾的是,错误又出现在其它地方,问题总是重蹈覆辙...

刘志军
2017/03/22
0
0
编码方式的区别以及文本在python2中的应用

背景: 文本以及字符串处理在网络应用中随处可见,面对不同的用户接口调用方,以及不同的我们需要调用的接口,可能都会有不一样的编码规范。 而我在以前的开发中,对于字符串的处理经常会是以...

WolfLC
2018/09/16
0
0
Dart 2.7 发布,新增扩展方法支持

Dart 2.7 发布了,此版本添加了对扩展方法的支持,并带来一个用于处理带有特殊字符的字符串的新程序包。DartPad 中 null 的安全性也得到了更新。 扩展方法 Dart 2.7 添加了一个强大的语言新功...

xplanet
2019/12/13
7.2K
24

没有更多内容

加载失败,请刷新页面

加载更多

如何添加或更新查询字符串参数?

使用javascript,如何将查询字符串参数添加到url(如果不存在)或如果存在,则更新当前值? 我正在使用jquery进行客户端开发。 #1楼 我已经扩展了该解决方案,并将其与我发现的另一个解决方案...

技术盛宴
13分钟前
33
0
恭喜你,Get到一份 正则表达式 食用指南

先赞后看,养成习惯 前言 正则表达式 正则表达式: 定义一个搜索模式的字符串。 正则表达式可以用于搜索、编辑和操作文本。 正则对文本的分析或修改过程为:首先正则表达式应用的是文本字符串...

鹿老师的Java笔记
14分钟前
40
0
《 Python编程快速上手:让繁琐工作自动化》分享下载

书籍信息 书名:《 Python编程快速上手:让繁琐工作自动化》 原作名:Automate the Boring Stuff with Python: Practical Programming for Total Beginners 作者: Albert Sweigart 豆瓣评分...

开始以后_
16分钟前
41
0
Java--代码执行顺序(静态初始化块,初始化块,构造函数)

先上结论 执行顺序:先执行静态初始化块,然后时初始化块,最后是构造函数 书写格式: 注意事项: 1. 静态初始化块   静态初始化块只在类首次加载时执行一次,同时静态初始化块只能给静态变...

fairy1674
20分钟前
39
0
第八课:《Linux就该这么学》课堂笔记

“工作马马虎虎,只想在兴趣和游戏中寻觅快活,充其量只能获得一时的快感,绝不能尝到从心底涌出的惊喜和快乐,但来自工作的喜悦并不像糖果那样—放进嘴里就甜味十足,而是需要从苦劳与艰辛中...

宣城热点科技
21分钟前
73
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部