Python中的正则表达式与Unicode:sub与findall的区别
我在调试我的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)
解决方法是一样的。