【问题标题】:Python: replace french letters with englishPython:用英文替换法语字母
【发布时间】:2017-04-21 15:46:47
【问题描述】:

希望将单词中的所有法语字母替换为对应的 ASCII。

letters = [['é', 'à'], ['è', 'ù'], ['â', 'ê'], ['î', 'ô'], ['û', 'ç']]

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.replace('ê', 'e')
        a = a.replace('î', 'i')
        a = a.replace('ô', 'o')
        a = a.replace('û', 'u')
        a = a.replace('ç', 'c')

print letters[0][0]

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

【问题讨论】:

标签: python string python-2.7 ascii french


【解决方案1】:

我可能为时已晚,但它可能会帮助寻找相同答案的人。 虽然我是 Python 新手,但我会这样处理:

letterXchange = {'à':'a', 'â':'a', 'ä':'a', 'é':'e', 'è':'e', 'ê':'e', 'ë':'e',
    'î':'i', 'ï':'i', 'ô':'o', 'ö':'o', 'ù':'u', 'û':'u', 'ü':'u', 'ç':'c'}
text = input() # Replace it with the string in your code.
for item in list(text):
    if item in letterXchange:
        text = text.replace(item,letterXchange.get(str(item)))
    else:
        pass
print (text)

【讨论】:

    【解决方案2】:

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

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

    循环中的行应该是a = a.replace('é', 'e')

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

    e:post 解释了如何访问循环中的变量

    【讨论】:

    • 这行不通。 letters 不会通过简单地将 replace 的结果分配给 a 来改变。
    • 这就是我添加最后一句的原因,“a”是x中值的副本(它是字母值的副本)。这些循环没有传递参考
    • 不,它们不是副本。这肯定不是 Python 的工作原理。
    【解决方案3】:

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

    from unidecode import unidecode
    
    s = "Héllô Càèùverâêt Jîôûç ïîäüë"
    s = unidecode(s)
    print(s)  # Hello Caeuveraet Jiouc iiaue
    

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

    【讨论】:

      【解决方案4】:

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

      在unicode结构中,像'ô'这样的字符实际上是一个复合字符,由字符'o'和另一个称为'COMBINING GRAVE ACCENT'的字符组成,这基本上是'̀'。使用unicodedata中的decomposition方法,可以得到这两部分的unicode(十六进制)。

      >>> import unicodedata as ud
      >>> ud.decomposition('ù')
      '0075 0300'
      >>> chr(0x0075)
      'u'
      >>> >>> chr(0x0300)
      '̀'
      

      因此,要从 'ù' 中检索 'u',我们可以先进行字符串拆分,然后使用内置的int 函数进行转换(参见this 线程将十六进制字符串转换为整数),然后使用chr函数获取字符。

      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 表示和实用程序的新手。如果有人对改进这段代码有任何建议,我将很高兴学习!

      干杯!

      【讨论】:

        【解决方案5】:

        我建议您考虑使用translation tables

        translationTable = str.maketrans("éàèùâêîôûç", "eaeuaeiouc")
        
        test = "Héllô Càèùverâêt Jîôûç"
        test = test.translate(translationTable)
        print(test)
        

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

        【讨论】:

        • 你的法语不好,但是你的python知识很好。它可能是最快的性能。
        • 这个解决方案并不聪明,因为最好使用内置包然后自己做。这是不好的做法。
        最近更新 更多