2012-09-02 22 views
9

我很驚訝我無法在正則表達式中匹配德語變音符號。我嘗試了幾種方法,大部分都涉及設置語言環境,但到目前爲止無濟於事。正則表達式匹配中的變音器(通過語言環境?)

locale.setlocale(locale.LC_ALL, 'de_DE.UTF-8') 
re.findall(r'\w+', 'abc def g\xfci jkl', re.L) 
re.findall(r'\w+', 'abc def g\xc3\xbci jkl', re.L) 
re.findall(r'\w+', 'abc def güi jkl', re.L) 
re.findall(r'\w+', u'abc def güi jkl', re.L) 

這些版本都沒有變音-U(U)提供\w+正確匹配。還刪除re.L標誌或用u(使其爲unicode)模式字符串前綴不幫助我。

任何想法?國旗re.L如何正確使用?

回答

16

您是否嘗試過使用re.UNICODE標誌,如doc中所述?

>>> re.findall(r'\w+', 'abc def güi jkl', re.UNICODE) 
['abc', 'def', 'g\xc3\xbci', 'jkl'] 

快速搜索指向該thread給出一些解釋:

re.LOCALE只是傳遞的字符底層C庫。它 真的只適用於每個字符有1個字節的字節串。 UTF-8 將ASCII範圍之外的代碼點編碼爲每個 代碼點的多個字節,並且re模塊將這些字節中的每一個作爲 單獨的字符處理。

+0

不,我沒有(過失),我不知道的該旗的存在,它解決了我的問題!謝謝,我會盡快將此標記爲接受的答案(除非更詳細的答案也將解釋爲什麼我的試用僅使用語言環境標誌未按預期工作)。 – Alfe

+0

編輯以提供鏈接以提供一些解釋 –

+0

如果您使用Python 2,請使用Unicode字符串(u「...」)。製作腳本UTF-8是一個好主意。忘記LOCALE標誌,將其視爲僅適用於傳統的東西(當你沒有別的選擇) – MRAB

0

在我的情況\S給了我更好的結果比\w,加上將文件保存爲UTF-8,再加上使用re.UNICODE

+1

也許在你的情況下,但'\ S'通常也可以匹配標點符號和特殊字符(例如♯或→或類似字符)。不是我所需要的。 – Alfe