当前位置: 代码迷 >> python >> 如何在 Python 3.5 中删除重音并使用 unicodedata 或其他解决方案获取字符串?
  详细解决方案

如何在 Python 3.5 中删除重音并使用 unicodedata 或其他解决方案获取字符串?

热度:55   发布时间:2023-06-14 08:49:12.0

我正在尝试获取一个字符串以在 google geocoding api 中使用。我检查了很多线程,但我仍然面临问题,我不明白如何解决它。

我需要 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 什么? 或者有更好的解决方案吗?

谢谢,

斯蒂芬。

使用第 3 方包:

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 包含所有字符,因此对其进行编码不会消除任何字符,并且使用它的编码-解码循环是无操作的。

有更好的解决方案吗?

这取决于你想要做什么。

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

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

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

Google Geocoding 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) 。

1) 正则表达式

分解字符串并替换来自 Unicode 块:

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

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

pingüino > pinguino
ε?κοσι ε?σι > εικοσι εισι

对于某些语言,它可能是另一个块,例如[\?-\?]用于。

2)str.translate

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

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

多字符替换如下:

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

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

不使用第 3 方软件包,您可以简化上面 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"

您可以使用 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()相比,您可以更轻松地定义要替换的字符

  相关解决方案