2013-07-18 184 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