Python中的正则表达式和Unicode:sub和findall之间的区别

时间:2011-06-10 16:31:48

标签: python regex unicode

我在尝试找出Python(2.7)脚本中的错误时遇到了困难。我在使用sub和findall识别特殊字符方面有所不同。

以下是代码:

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

当我使用findall时,它正确地将ñ视为字母字符,但是当我使用sub时它会替换它 - 将其视为非字母字符。

我已经能够使用findall和string.replace获得正确的功能,但这似乎是一个糟糕的解决方案。另外,我想使用re.split,我遇到与re.sub。

相同的问题

提前感谢您的帮助。

1 个答案:

答案 0 :(得分:7)

re.sub的来电签名是:

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

所以

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

count设置为re.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)

解决方案是一样的。