Python 2.7中如何正确使用re.UNICODE标志?
哦,我一眼就看到问题啦——你把re.UNICODE传错地方了!
问题根源
re.findall()的第二个参数不是正则标志位,而是匹配的起始位置(默认值为0)。你传入的re.UNICODE对应数值是4,相当于让程序从字符串的第4个字符之后开始查找,自然找不到任何内容,所以返回空列表。
正确解决方法
有两种靠谱的写法,任选其一就行:
1. 预编译正则时指定re.UNICODE
编译正则表达式时把标志位传进去,之后调用findall不需要再额外传参数:
import re r = re.compile(ur"(\w+)", re.UNICODE) r.findall(u"test test test") # 这里不用传re.UNICODE! # 输出: [u'test', u'test', u'test']
2. 直接调用re.findall()时传标志位
如果不用预编译,需要把re.UNICODE作为第三个参数传给findall:
import re re.findall(ur"(\w+)", u"test test test", re.UNICODE) # 输出: [u'test', u'test', u'test']
验证Unicode字符处理效果
咱们来测试带非ASCII字符的场景,看看re.UNICODE的作用:
r = re.compile(ur"(\w+)", re.UNICODE) r.findall(u"café 北京 123 _abc") # 输出: [u'café', u'北京', u'123', u'_abc']
如果不加re.UNICODE,Python 2里的\w只会匹配ASCII字母、数字和下划线,上面的例子就会返回[u'123', u'_abc'],其他Unicode字符都会被当成非单词字符分割开。
内容的提问来源于stack exchange,提问作者faiuwle
相关产品推荐
相关产品推荐

