如何在Python 3.5 中去除重音并获取带有unicodedata 或其他解决方案的字符串?

How to remove accent in Python 3.5 and get a string with unicodedata or other solutions?

我正在尝试获取要在 google 地理编码中使用的字符串 api.I 我已经检查了很多线程,但我仍然面临问题,我不知道如何解决它。

我需要 addresse1 是一个没有任何特殊字符的字符串。 Addresse1 例如:“32 rue d'Athènes Paris France”。

addresse1= collect.replace(' ','+').replace('\n','') 
addresse1=unicodedata.normalize('NFKD', addresse1).encode('utf-8','ignore') 

这里我得到了一个没有任何重音符号的字符串...呵呵不...它不是一个字符串而是一个字节。所以我已经完成了建议并“解码:

addresse1=addresse1.decode('utf-8') 

但是 addresse1 和开头的一模一样...我该怎么办?我究竟做错了什么?或者我不明白 unicode?或者有更好的解决方案吗?

谢谢,

史蒂芬。

您可以使用 python 中的 translate() 方法。 这是从 tutorialspoint.com:

复制的示例
#!/usr/bin/python

from string import maketrans   # Required to call maketrans function.

intab = "aeiou"
outtab = "12345"
trantab = maketrans(intab, outtab)

str = "this is string example....wow!!!";
print str.translate(trantab)

这输出:

th3s 3s str3ng 2x1mpl2....w4w!!!

因此您可以定义要替换的字符,比 replace()

更容易

使用第 3 方包:unidecode

3>> unidecode.unidecode("32 rue d'Athènes Paris France")
"32 rue d'Athenes Paris France"

addresse1=unicodedata.normalize('NFKD', addresse1).encode('utf-8','ignore')

您的意思可能是 .encode('ascii', 'ignore'),删除非 ASCII 字符。 UTF-8 包含所有字符,因此对其进行编码不会删除任何字符,并且使用它进行编码-解码循环是空操作。

is there a better solution?

这取决于您要做什么。

如果您只想删除变音符号而不想丢失所有其他非 ASCII 字符,您可以在 NFKD 规范化后读取每个字符 unicodedata.category 并删除类别 M 中的字符。

如果您想音译为 ASCII 成为特定语言的问题,需要自定义替换(例如德语 ö 变成 oe,但瑞典语不是)。

如果你只是想将一个字符串伪造成 ASCII,因为其中包含非 ASCII 字符会导致一些代码中断,当然,修复该代码以使其与所有 Unicode 字符一起正常工作比破坏好要好得多数据。字母 è 在 ASCII 中不可编码,但所有字符中的 99.9989% 都不可编码,因此很难使其“特殊”。只支持 ASCII 的代码是蹩脚的。

Google 地理编码 API 可以很好地与 Unicode 配合使用,因此您没有明显的理由需要这样做。

预计到达时间:

url2= 'maps.googleapis.com/maps/api/geocode/json?address=' + addresse1 ...

啊,你需要 URL 对你注入的任何数据进行编码 URL。这不仅适用于 Unicode——上面的代码也适用于许多 ASCII 标点符号。使用urllib.quote编码单个字符串,或urllib.encode转换多个参数:

params = dict(
    address=address1.encode('utf-8'),
    key=googlekey
)
url2 = '...?' + urllib.urlencode(params)

(在 Python 3 中是 urllib.parse.quoteurllib.parse.encode,它们会自动选择 UTF-8,因此您不必在那里手动编码。)

data2 = urllib.request.urlopen(url2).read().decode('utf-8')
data3=json.loads(data2)

json.loads 读取字节字符串,因此您应该安全地忽略 UTF-8 解码。无论如何 json.load 将直接从类似文件的对象中读取,因此您根本不必将数据加载到字符串中:

data3 = json.load(urllib.request.urlopen(url2))

通常有两种方法:(1) 正则表达式和 (2) str.translate.

1) 正则表达式

分解字符串并替换 Unicode 块中的字符 \u0300-\u036f:

import unicodedata
import re
word = unicodedata.normalize("NFD", word)
word = re.sub("[\u0300-\u036f]", "", word)

它删除重音、抑扬音、分音符等:

pingüino > pinguino
εἴκοσι εἶσι > εικοσι εισι

对于某些语言,它可能是另一个块,例如 [\u0559-\u055f] 代表 Armenian script

2) str.translate

首先,创建替换 table(区分大小写),然后应用它。

repl = str.maketrans(
    "áéúíó",
    "aeuio"
)
word.translate(repl)

多字符替换如下:

repl = {
    ord("æ"): "ae",
    ord("œ"): "oe",
}
word.translate(repl)

我在生成标签时遇到了类似的问题,用户可能必须使用他们的 phone 输入这些标签。

在不使用第三方包的情况下,您可以简化上述 bobinces 的回答:

collect = "32 rue d'Athènes Paris France"
unicode_collect = unicodedata.normalize('NFD', collect)
address1 = unicode_collect.encode('ascii', 'ignore').decode('utf-8')

address1:
"32 rue d'Athenes Paris France"