Python非常令人费解的正则表达式unicode行为

时间:2013-04-17 18:44:55

标签: python regex unicode python-2.7

我使用分词器将法语句子分成单词,并且包含法语字符â的单词出现问题。

我试图找出问题并最终归结为这个简单的事实:

>>> re.match(r"’", u'â', re.U)
>>> re.match(r"[’]", u'â', re.U)
<_sre.SRE_Match object at 0x21d41d0>

â与包含 的模式相匹配,如果将其放入合奏匹配器中。

我对UTF-8处理有什么不妥,还是个bug?

我的python版本是:

Python 2.7.3 (default, Jan  2 2013, 13:56:14) 
[GCC 4.7.2] on linux2

修改

嗯,令人尴尬的是,似乎用r替换模式前缀的u可以解决问题。

我想知道为什么官方文档广泛使用r然后:((

1 个答案:

答案 0 :(得分:7)

你的模式也应该是一个unicode字符串:

 >>> re.match(ur"’", u'â', re.U)
 >>> re.match(ur"[’]", u'â', re.U)

否则显然sreâ编码为latin-1,并在三个字节中查找结果字节,即utf-8

"[’]"相当于"[\xe2\x80\x99]"u'â'.encode('latin-1')\xe2