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的大å°�写转æ�¢å’Œå…¶ä»–大é‡�有趣特性æ��供全é�¢çš„æ”¯æŒ�,包括模糊匹é…�。