关于字符串:Python:用英语替换法语字母

Python: replace french letters with english

希望将单词内的所有法语字母替换为它们的ASCII等价物。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
letters = [['é', 'à'], ['è', 'ù'], ['a', 'ê'], ['?', '?'], ['?', '?']]

for x in letters:
   for a in x:
        a = a.replace('é', 'e')
        a = a.replace('à', 'a')
        a = a.replace('è', 'e')
        a = a.replace('ù', 'u')
        a = a.replace('a', 'a')
        a = a.replace('ê', 'e')
        a = a.replace('?', 'i')
        a = a.replace('?', 'o')
        a = a.replace('?', 'u')
        a = a.replace('?', 'c')

print letters[0][0]

但是,此代码打印é。我怎样才能做到这一点?


我建议你考虑使用翻译表。

1
2
3
4
5
translationTable = str.maketrans("éàèùaê????","eaeuaeiouc")

test ="Héll? Càèùveraêt J????"
test = test.translate(translationTable)
print(test)

将打印Hello Caeuveraet Jiouc。请原谅我的法语。


您也可以使用unidecode。安装:pip install unidecode。然后,做:

1
2
3
4
5
from unidecode import unidecode

s ="Héll? Càèùveraêt J???? ???ü?"
s = unidecode(s)
print(s)

结果将是相同的字符串,但法语字符将被转换为其等价的ASCII码:Hello Caeuveraet Jiouc iiaue


replace函数返回被替换字符的字符串。

在代码中,不存储此返回值。

循环中的行应为"a=a.replace('_','e')"。

您还需要存储输出,以便最终打印它。

E:这篇文章解释了如何访问循环中的变量


这是另一个解决方案,使用名为unicodedata的低级Unicode包。

在Unicode结构中,类似"?"的字符实际上是一个复合字符,由字符"o"和另一个称为"组合重音符"的字符组成,基本上是"?".利用unicodedata中的decomposition方法,可以得到这两部分的单码(十六进制)。

1
2
3
4
5
6
7
>>> import unicodedata as ud
>>> ud.decomposition('ù')
'0075 0300'
>>> chr(0x0075)
'u'
>>> >>> chr(0x0300)
'?'

因此,要从"_"中检索"U",我们可以先执行字符串拆分,然后使用内置的int函数进行转换(有关将十六进制字符串转换为整数的信息,请参见此线程),然后使用chr函数获取字符。

1
2
3
4
5
6
7
8
import unicodedata as ud

def get_ascii_char(c):
    s = ud.decomposition(c)
    if s == '': # for an indecomposable character, it returns ''
        return c
    code = int('0x' + s.split()[0], 0)
    return chr(code)

我不熟悉Python中的Unicode表示和实用程序。如果有人对改进这段代码有任何建议,我会很高兴知道的!

干杯!