2.10 在正则�中使用Unicode¶

问题¶

你正在使用正则表达�处�文本,但是关注的是Unicode字符处�。

解决方案¶

默认情况下 re 模�已�对一些Unicode字符类有了基本的支�。 比如, \\d 已�匹�任�的unicode数字字符了:

>>> import re
>>> num = re.compile('\d+')
>>> # ASCII digits
>>> num.match('123')
<_sre.SRE_Match object at 0x1007d9ed0>
>>> # Arabic digits
>>> num.match('\u0661\u0662\u0663')
<_sre.SRE_Match object at 0x101234030>
>>>

如果你想在模�中包�指定的Unicode字符,你�以使用Unicode字符对应的转义�列(比如 \uFFF 或者 \UFFFFFFF )。 比如,下�是一个匹�几个��阿拉伯编�页�中所有字符的正则表达�:

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

当执行匹�和�索�作的时候,最好是先标准化并且清�所有文本为标准化格�(�考2.9�节)。 但是�样也应该注�一些特殊情况,比如在忽略大�写匹�和大�写转�时的行为。

>>> pat = re.compile('stra\u00dfe', re.IGNORECASE)
>>> s = 'straße'
>>> pat.match(s) # Matches
<_sre.SRE_Match object at 0x10069d370>
>>> pat.match(s.upper()) # Doesn't match
>>> s.upper() # Case folds
'STRASSE'
>>>

讨论¶

混�使用Unicode和正则表达�通常会让你抓狂。 如果你真的打算这样�的�,最好考虑下安装第三方正则�库, 它们会为Unicode的大�写转�和其他大�有趣特性�供全�的支�,包括模糊匹�。