我的文件包含带有D\u00f3nde est\u00e1s
等unicode编码的行。
如果每个单词只包含来自set locale的字符,我想检查每个单词。
此代码不完全有效。该字符串似乎正确转换为Dónde estás
并且wordmatch匹配每个单词,但它不考虑语言环境设置。例如。如果我将语言环境设置为en_US,即使它们包含ó
和á
字符,它仍会匹配这两个单词。
使用re.LOCALE而不是re.UNICODE似乎也不起作用,并且这两个单词不再与wordmatch正则表达式匹配。
import re
import locale
locale.setlocale(locale.LC_ALL,'en_ES')
wordmatch=re.compile(r'^\w*$',re.UNICODE)
line="D\u00f3nde est\u00e1s"
line=line.decode('unicode_escape')
for word in line.split():
if wordmatch.match(word):
print "Matched "+word
else:
print "No match "+word
答案 0 :(得分:1)
更改区域设置并不直接意味着更改编码,en_US
的编码不会强制ascii
。在我的系统上,例如iso-8859-1
,ó
和á
有效的编码。这可以解释为什么re.LOCALE
不会抱怨这些字符。
为了操纵编码,我宁愿使用encode
函数而不是正则表达式:
line="D\u00f3nde est\u00e1s"
line=line.decode('unicode_escape')
# get current encoding, or set to "ascii" if you want to be more restrictive
pref_encoding = locale.getpreferedencoding()
for word in line.split():
try:
w = word.encode(pref_encoding)
except UnicodeEncodeError as e:
print "This word contains unacceptable characters: ", word
break