如何从 python 中的字符串中删除重音符号
how to remove accents from a string in python
我最近在大学里做了一个测试,问题是这样的——“问一个名字,然后把它的重音去掉并打印出来”(这个问题还有很多,但这对我来说是主要问题) .
我的老师不允许我们使用字符串或列表方法,只是基本的字面意思(if、while 循环、for 循环、数组),我们唯一允许使用的方法是 find()
, index()
和 len()
.
因此,例如需要打印的姓名 José 有 Jose,或 José Magalhães 应该是 Jose Magalhaes
如果你能用基本的东西说出解决这个问题的方法,我将不胜感激。
谢谢。
text_normalizing_map = {'À': 'A',
'Á': 'A',
'Â': 'A',
'Ã': 'A',
'Ä': 'A',
'È': 'E',
'É': 'E',
'Ê': 'E',
'Ë': 'E',
'Í': 'I',
'Ì': 'I',
'Î': 'I',
'Ï': 'I',
'Ù': 'U',
'Ú': 'U',
'Û': 'U',
'Ü': 'U',
'Ò': 'O',
'Ó': 'O',
'Ô': 'O',
'Õ': 'O',
'Ö': 'O',
'Ñ': 'N',
'Ç': 'C',
'ª': 'A',
'º': 'O',
'§': 'S',
'³': '3',
'²': '2',
'¹': '1',
'à': 'a',
'á': 'a',
'â': 'a',
'ã': 'a',
'ä': 'a',
'è': 'e',
'é': 'e',
'ê': 'e',
'ë': 'e',
'í': 'i',
'ì': 'i',
'î': 'i',
'ï': 'i',
'ù': 'u',
'ú': 'u',
'û': 'u',
'ü': 'u',
'ò': 'o',
'ó': 'o',
'ô': 'o',
'õ': 'o',
'ö': 'o',
'ñ': 'n',
'ç': 'c'}
def normalize(text):
list_text = list(text)
for index, i in enumerate(list_text):
val = text_normalizing_map.get(i)
if(val):
list_text[index] = val
return "".join(list_text)
print(normalize("José Magalhães "))
输出
Jose Magalhaes
翻译函数通常是最快的,因为它是一对一的字符映射:
normalMap = {'À': 'A', 'Á': 'A', 'Â': 'A', 'Ã': 'A', 'Ä': 'A',
'à': 'a', 'á': 'a', 'â': 'a', 'ã': 'a', 'ä': 'a', 'ª': 'A',
'È': 'E', 'É': 'E', 'Ê': 'E', 'Ë': 'E',
'è': 'e', 'é': 'e', 'ê': 'e', 'ë': 'e',
'Í': 'I', 'Ì': 'I', 'Î': 'I', 'Ï': 'I',
'í': 'i', 'ì': 'i', 'î': 'i', 'ï': 'i',
'Ò': 'O', 'Ó': 'O', 'Ô': 'O', 'Õ': 'O', 'Ö': 'O',
'ò': 'o', 'ó': 'o', 'ô': 'o', 'õ': 'o', 'ö': 'o', 'º': 'O',
'Ù': 'U', 'Ú': 'U', 'Û': 'U', 'Ü': 'U',
'ù': 'u', 'ú': 'u', 'û': 'u', 'ü': 'u',
'Ñ': 'N', 'ñ': 'n',
'Ç': 'C', 'ç': 'c',
'§': 'S', '³': '3', '²': '2', '¹': '1'}
normalize = str.maketrans(normalMap)
输出:
print("José Magalhães ".translate(normalize))
# Jose Magalhaes
如果不允许使用 str 的方法,您仍然可以使用字典:
S = "José Magalhães "
print(*(normalMap.get(c,c) for c in S),sep="")
# Jose Magalhaes
如果不允许使用字典,可以使用两个字符串映射字符并循环遍历字符串:
fromChar = "ÀÁÂÃÄàáâãäªÈÉÊËèéêëÍÌÎÏíìîïÒÓÔÕÖòóôõöºÙÚÛÜùúûüÑñÇç§³²¹"
toChar = "AAAAAaaaaaAEEEEeeeeIIIIiiiiOOOOOoooooOUUUUuuuuNnCcS321"
S = "José Magalhães "
R = "" # start result with an empty string
for c in S: # go through characters
p = fromChar.find(c) # find position of accented character
R += toChar[p] if p>=0 else c # use replacement or original character
print(R)
# Jose Magalhaes
我最近在大学里做了一个测试,问题是这样的——“问一个名字,然后把它的重音去掉并打印出来”(这个问题还有很多,但这对我来说是主要问题) .
我的老师不允许我们使用字符串或列表方法,只是基本的字面意思(if、while 循环、for 循环、数组),我们唯一允许使用的方法是 find()
, index()
和 len()
.
因此,例如需要打印的姓名 José 有 Jose,或 José Magalhães 应该是 Jose Magalhaes
如果你能用基本的东西说出解决这个问题的方法,我将不胜感激。 谢谢。
text_normalizing_map = {'À': 'A',
'Á': 'A',
'Â': 'A',
'Ã': 'A',
'Ä': 'A',
'È': 'E',
'É': 'E',
'Ê': 'E',
'Ë': 'E',
'Í': 'I',
'Ì': 'I',
'Î': 'I',
'Ï': 'I',
'Ù': 'U',
'Ú': 'U',
'Û': 'U',
'Ü': 'U',
'Ò': 'O',
'Ó': 'O',
'Ô': 'O',
'Õ': 'O',
'Ö': 'O',
'Ñ': 'N',
'Ç': 'C',
'ª': 'A',
'º': 'O',
'§': 'S',
'³': '3',
'²': '2',
'¹': '1',
'à': 'a',
'á': 'a',
'â': 'a',
'ã': 'a',
'ä': 'a',
'è': 'e',
'é': 'e',
'ê': 'e',
'ë': 'e',
'í': 'i',
'ì': 'i',
'î': 'i',
'ï': 'i',
'ù': 'u',
'ú': 'u',
'û': 'u',
'ü': 'u',
'ò': 'o',
'ó': 'o',
'ô': 'o',
'õ': 'o',
'ö': 'o',
'ñ': 'n',
'ç': 'c'}
def normalize(text):
list_text = list(text)
for index, i in enumerate(list_text):
val = text_normalizing_map.get(i)
if(val):
list_text[index] = val
return "".join(list_text)
print(normalize("José Magalhães "))
输出
Jose Magalhaes
翻译函数通常是最快的,因为它是一对一的字符映射:
normalMap = {'À': 'A', 'Á': 'A', 'Â': 'A', 'Ã': 'A', 'Ä': 'A',
'à': 'a', 'á': 'a', 'â': 'a', 'ã': 'a', 'ä': 'a', 'ª': 'A',
'È': 'E', 'É': 'E', 'Ê': 'E', 'Ë': 'E',
'è': 'e', 'é': 'e', 'ê': 'e', 'ë': 'e',
'Í': 'I', 'Ì': 'I', 'Î': 'I', 'Ï': 'I',
'í': 'i', 'ì': 'i', 'î': 'i', 'ï': 'i',
'Ò': 'O', 'Ó': 'O', 'Ô': 'O', 'Õ': 'O', 'Ö': 'O',
'ò': 'o', 'ó': 'o', 'ô': 'o', 'õ': 'o', 'ö': 'o', 'º': 'O',
'Ù': 'U', 'Ú': 'U', 'Û': 'U', 'Ü': 'U',
'ù': 'u', 'ú': 'u', 'û': 'u', 'ü': 'u',
'Ñ': 'N', 'ñ': 'n',
'Ç': 'C', 'ç': 'c',
'§': 'S', '³': '3', '²': '2', '¹': '1'}
normalize = str.maketrans(normalMap)
输出:
print("José Magalhães ".translate(normalize))
# Jose Magalhaes
如果不允许使用 str 的方法,您仍然可以使用字典:
S = "José Magalhães "
print(*(normalMap.get(c,c) for c in S),sep="")
# Jose Magalhaes
如果不允许使用字典,可以使用两个字符串映射字符并循环遍历字符串:
fromChar = "ÀÁÂÃÄàáâãäªÈÉÊËèéêëÍÌÎÏíìîïÒÓÔÕÖòóôõöºÙÚÛÜùúûüÑñÇç§³²¹"
toChar = "AAAAAaaaaaAEEEEeeeeIIIIiiiiOOOOOoooooOUUUUuuuuNnCcS321"
S = "José Magalhães "
R = "" # start result with an empty string
for c in S: # go through characters
p = fromChar.find(c) # find position of accented character
R += toChar[p] if p>=0 else c # use replacement or original character
print(R)
# Jose Magalhaes