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

m09*_*m09 7 python regex unicode python-2.7

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

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

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

â与一个模式相匹配, 如果它放在一个整体匹配器中.

关于UTF-8处理我是否有问题或者它是一个错误?

我的python版本是:

Python 2.7.3 (default, Jan  2 2013, 13:56:14) 
[GCC 4.7.2] on linux2
Run Code Online (Sandbox Code Playgroud)

编辑:

嗯,令人尴尬的是,似乎r用一个u修复问题来替换模式的前缀.

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

Pav*_*sov 7

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

 >>> re.match(ur"’", u'â', re.U)
 >>> re.match(ur"[’]", u'â', re.U)
Run Code Online (Sandbox Code Playgroud)

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

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