Python中的正则表达式与Unicode:sub与findall的区别

5 投票
1 回答
4069 浏览
提问于 2025-04-16 19:19

我在调试我的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 个回答

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)。(想了解更多,可以点击这个链接,然后搜索“(?iLmsux)”。)

同样,re.split的调用方式是:

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

解决方法是一样的。

撰写回答