在将文本转换为词表时,如何保留法语特殊字符?

时间:2018-01-24 13:33:17

标签: python character-encoding

我正在使用一段代码来表示马尔可夫链句生成器。在英语中工作正常,但在法语中,它不会打印出特殊字符(é,è等)。

这是读取文件并从中创建单词列表的部分。我使用print语句作为控件,这使我可以看到print(text)打印特殊字符,但是一旦将单词添加到wordlist中,它们就会消失。

def wordlist(filename):
    f = open(filename, mode='r')
    text = f.read()
    print(text)
    wordlist = [fixCaps(w) for w in re.findall(r"[\w']+|[.,!?;]", text)]
    print(wordlist)
    f.close()
    return wordlist

创建单词列表时如何保留特殊字符? (我在Windows 7上用Python 2.x运行它)

输出示例:

Permettez-moi d'inscrire votre nom en tête de ce livre et au-
dessus même de sa dédicace; car c'est à vous, surtout, que j'en
dois la publication. En passant par votre magnifique plaidoirie,
mon oeuvre a acquis pour moi-même comme une autorité imprévue.
Acceptez donc ici l'hommage de ma gratitude, qui, si grande
qu'elle puisse être, ne sera jamais à la hauteur de votre
éloquence et de votre dévouement.
['Permettez', 'moi', "d'inscrire", 'votre', 'nom', 'en', 't', 'te', 'de', 'ce', 'livre', 'et', 'au', 'dessus', 'm', 'me', 'de', 'sa', 'd', 'dicace', ';', 'car', "c'est", 'vous', ',', 'surtout', ',', 'que', "j'en", 'dois', 'la', 'publication', '.', 'En', 'passant', 'par', 'votre', 'magnifique', 'plaidoirie', ',', 'mon', 'oeuvre', 'a', 'acquis', 'pour', 'moi', 'm', 'me', 'comme', 'une', 'autorit', 'impr', 'vue', '.', 'Acceptez', 'donc', 'ici', "l'hommage", 'de', 'ma', 'gratitude', ',', 'qui', ',', 'si', 'grande', "qu'elle", 'puisse', 'tre', ',', 'ne', 'sera', 'jamais', 'la', 'hauteur', 'de', 'votre', 'loquence', 'et', 'de', 'votre', 'd', 'vouement', '.']
En passant par votre magnifique plaidoirie, mon oeuvre a acquis pour moi m me comme une autorit impr vue.

由于

1 个答案:

答案 0 :(得分:0)

这些词实际上并没有消失,它们与你的表达不匹配:

wordlist = [fixCaps(w) for w in re.findall(r"[\w']+|[.,!?;]", text)]

转义\w匹配"字符",但解释实际上是什么字符'是的,因GREP实施而异:

  

\w代表"字符"。它始终与ASCII字符[A-Za-z0-9_]匹配。请注意包含下划线和数字。在大多数支持Unicode的版本中,\w包含来自其他脚本的许多字符。关于实际包含哪些字符存在很多不一致   (https://www.regular-expressions.info/shorthand.html

默认情况下,Python 2.7的\w仅匹配 基本限制集,但您可以添加标记以询问更多内容:

  

\w
  如果未指定LOCALEUNICODE标志,则匹配任何字母数字字符和下划线;这相当于集合[a-zA-Z0-9_]。对于LOCALE,它将匹配集[0-9_]以及为当前区域设置定义为字母数字的任何字符。如果设置了UNICODE,则会匹配字符[0-9_]以及Unicode字符属性数据库中分类为字母数字的字符。
  (https://docs.python.org/2/library/re.html

这表明以下代码(略微调整为不使用文件;它是产生差异的正则表达式):

def wordlist(text):
    regex = re.compile (r"[\w']+|[.,!?;]", re.UNICODE)
    print(text)
    wordlist = [fixCaps(w) for w in re.findall(regex, text)]
    return wordlist

现在确实包含了重音字符:

['Permettez', 'moi', "d'inscrire", 'votre', 'nom', 'en', 't\xc3\xaate', 'de', 'ce', 'livre',
 'et', 'au', 'dessus', 'm\xc3\xaame', 'de', 'sa', 'd\xc3', 'dicace', ';', 'car', "c'est",
...
# etc.

Python 3及更高版本具有更好的Unicode支持,因此您不必使用该标记,并且您的原始代码可以按预期使用\w

['Permettez', 'moi', "d'inscrire", 'votre', 'nom', 'en', 'tête', 'de',
 'ce', 'livre', 'et', 'au', 'dessus', 'même', 'de', 'sa', 'dédicace', ';',
   ...

(其中一个额外的好处是重音字符不会输出为\xnn)。