Python进阶编程:编写更高效、优雅的Python代码
上QQ阅读APP看书,第一时间看更新

2.6 在正则表达式中使用Unicode字符

在实际应用中,我们需要使用正则表达式处理Unicode字符。

默认情况下,re模块已经对一些Unicode字符类有了基本的支持。比如,\\d已经匹配任意的unicode数字字符,相关代码(re_unicode.py)示例如下:


import re
num = re.compile('\d+')
print(num.match('123'))
print(num.match('\u0661\u0662\u0663'))

执行py文件,输出结果如下:


<re.Match object; span=(0, 3), match='123'>
<re.Match object; span=(0, 3), match='١٢٣'>

如果想在模式中包含指定的Unicode字符,可以使用Unicode字符对应的转义序列(比如\uFFF或者\UFFFFFFF)。下面是一个匹配不同阿拉伯编码页面中所有字符的正则表达式,代码如下:


arabic = re.compile('[\u0600-\u06ff\u0750-\u077f\u08a0-\u08ff]+')
print(arabic)

当执行匹配和搜索操作的时候,最好先处理所有文本为标准化格式,但也应该注意一些特殊情况,如忽略大小写匹配和大小写转换的行为。


pat = re.compile('stra\u00dfe', re.IGNORECASE)
test_str = 'straße'
print(pat.match(test_str))
print(pat.match(test_str.upper()))
print(test_str.upper())

混合使用Unicode和正则表达式通常没有那么好处理。如果真这样做,最好安装第三方正则表达式库,它会为Unicode的大小写转换和其他特性提供全面的支持,包括模糊匹配。