如何在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.quote
和 urllib.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"
我正在尝试获取要在 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.quote
和 urllib.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"