Python极其令人困惑的正则表达式Unicode行为

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

编辑:

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

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


r 是正确且重要的。您应该在不替换 r 的情况下添加 u(请参见答案)。 - Martin Ender
@m.buettner:是的,我在看到答案之前进行了编辑。我继续检查了ru的作用,确实两者都很重要。谢谢 :) - m09
1个回答

7

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

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

否则,显然将â编码为latin-1,并在三个字节中找到utf-8的结果字节。 "[’]"等同于"[\xe2\x80\x99]"u'â'.encode('latin-1')\xe2

谢谢你的提示,我在你回答之前就注意到了 :) - m09
re.U 并不能神奇地打开 Unicode,它只是改变了 \w 的含义。 - Pavel Anossov

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接