Python 2与Python 3正则表达式匹配行为

时间:2015-01-22 12:06:41

标签: python regex python-3.x

Python 3

import re

P = re.compile(r'[\s\t]+') 
re.sub(P, ' ', '\xa0 haha')
' haha' 

Python 2

import re

P = re.compile(r'[\s\t]+')
re.sub(P, u' ', u'\xa0 haha')
u'\xa0 haha'

我希望Python 3的行为,但在Python 2代码中。为什么正则表达式模式无法与Python 2中的\xa0之类的类似空格的代码点匹配,但在Python 3中正确匹配这些代码点?

1 个答案:

答案 0 :(得分:5)

使用re.UNICODE标志:

>>> import re
>>> P = re.compile(r'[\s\t]+', flags=re.UNICODE)
>>> re.sub(P, u' ', u'\xa0 haha')
u' haha'

没有标志,只匹配ASCII空格; \xa0不是ASCII标准的一部分(它是Latin-1代码点)。

{3}中的re.UNICODE标志是默认标志;如果你想要Python 2(字节串)行为,请使用re.ASCII

请注意,在字符类中包含\t没有意义; \t已经是\s类的一部分,因此以下内容将与完全相同的输入匹配:

P = re.compile(r'\s+', flags=re.UNICODE)