python正则表达式不匹配解码的unicode字符串

时间:2013-07-18 00:51:00

标签: python regex 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每个人都说好,但我想知道我现在的东西有什么问题!:)。

1 个答案:

答案 0 :(得分:0)

  

\ B'/ P>

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

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

的UTF-8字节序列,当被错误解码为ISO-8859-1时,出现为ã[control char]°。学位标志不是一个孤儿,所以你得到一个匹配。