我正在使用一段代码来表示马尔可夫链句生成器。在英语中工作正常,但在法语中,它不会打印出特殊字符(é,è等)。
这是读取文件并从中创建单词列表的部分。我使用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.
由于
答案 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
如果未指定LOCALE
和UNICODE
标志,则匹配任何字母数字字符和下划线;这相当于集合[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
)。