用于正则表达式的Python unicode编码

时间:2014-02-13 21:01:23

标签: python unicode encoding

我的文件包含带有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

1 个答案:

答案 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