2013-07-18 232 views
2

我使用编译我正则表达式:蟒蛇正则表达式不匹配解码unicode字符串

number_re = re.compile(ur'(?<![-_\.])\b([0-9]+|[0-9]+[0-9-_\.]*[0-9]+)\b(?![-_\.])'), re.UNICODE) 

,并设法在下面的字符串匹配1990-1991

mystring = 'フットボールリーグ1990-1991' 
match = number_re.search(mystring) 
>>> <_sre.SRE_Match at 0x25e1918> 
match.group() 
>>> '1990-1991' 

但是当字符串被解码(或者当它被传入函数时)

mystring = 'フットボールリーグ1990-1991'.decode('utf-8') 
>>> u'\u30d5\u30c3\u30c8\u30dc\u30fc\u30eb\u30ea\u30fc\u30b01990-1991' 
match = number_re.search(mystring) 

匹配不再发生,我猜它与边界'\ b'不匹配,因为它看起来像一个连续的字符串,但我不完全确定。

我认为我已经把所有的unicode要求(用're.UNICODE'标志编译,并且把'ur'放在我的正则表达式字符串中。我要去尝试的最后一件事是大家都说的Python regex library是好的,但我想知道我目前的东西有什么问题!:)。

+0

不混合Unicode和非Unicode字符串(字节)。 [您无法将Unicode字符串与字节模式匹配,反之亦然](http://docs.python.org/3/library/re.html) – jfs

回答

0

\ b

没有信和数量1 - 它们都是字母数字之间的字边界。当使用Unicode感知的正则表达式被正确处理时,因此不匹配。如果您不想将片假名和其他非ASCII字母视为alphanums,请删除控制此行为的re.UNICODE标志。

当您将字节字符串发送到从Unicode字符串编译的正则表达式时,它会自动解码。出于某种原因,它似乎被解码为ISO-8859-1(而不是,比如说,sys.getdefaultencoding())......不知道这是为什么,但隐含的编码/解码通常是邪恶的以避免。

当解码为ISO-8859-1时,的UTF-8字节序列作为ã[control char]°出现。度数标志不是一个字母,所以你得到一个匹配。

+0

非常感谢!我知道这个词边界很腥,哈哈。 – ishikun