2011-06-10 35 views
5

我在嘗試找出Python(2.7)腳本中的錯誤時遇到困難。我在使用sub和findall來區別特殊字符。Python中的正則表達式和Unicode:sub和findall之間的差異

下面是代碼:

>>> re.sub(ur"[^-'().,\w]+", '' , u'Castañeda', re.UNICODE) 
u'Castaeda' 
>>> re.findall(ur"[^-'().,\w]+", u'Castañeda', re.UNICODE) 
[] 

當我使用的findall,它正確地看到N作爲一個字母,但是當我使用分吧替換本 - 把它當作一個非字母字符。

我已經能夠使用findall與string.replace獲得正確的功能,但這似乎是一個不好的解決方案。另外,我想使用re.split,並且遇到與re.sub相同的問題。

在此先感謝您的幫助。

+0

您使用的是哪個版本?它工作得很好2.7.1 – viraptor 2011-06-10 16:39:36

+0

基於Python 2.7.1的ActivePython 2.7.1.4。謝謝你讓我知道它對你的工作很好。我的安裝可能有問題...我只是在Python 2.6.4上試過它,這也在我的機器上,而且我遇到了同樣的問題 – user793061 2011-06-10 17:02:55

+0

我在ubuntu 11.04的控制檯上測試了它。以LANG = en_GB.UTF-8開始,沒有LC條目。 – viraptor 2011-06-10 17:04:54

回答

7

re.sub調用簽名是:

re.sub(pattern, repl, string, count=0) 

所以

re.sub(ur"[^-'().,\w]+", '' , u'Castañeda', re.UNICODE) 

被設置countre.UNICODE,其值32

嘗試,而不是:

In [57]: re.sub(ur"(?u)[^-'().,\w]+", '', u'Castañeda') 
Out[57]: u'Casta\xf1eda' 

在正則表達式開始處放置(?u)是在正則表達式本身中指定re.UNICODE標誌的替代方法。您也可以通過這種方式設置其他標誌 (?iLmsux)。 (欲瞭解更多信息請點擊this link並搜索 「(iLmsux)?」)。

同樣,re.split調用簽名是:

re.split(pattern, string, maxsplit=0) 

的解決方案是一樣的。

+0

看起來像它修復它!非常感謝! – user793061 2011-06-10 17:16:48

+0

如果你想使用unicode字符屬性(如'\ p {L}'),你必須知道're'不支持它。 http://pypi.python.org/pypi/regex呢。 – noisy 2013-06-01 13:10:15