从unicode字符串中删除选定的标点符号

时间:2014-07-08 16:34:10

标签: python regex python-2.7 unicode punctuation

我正在使用一组unicode字符串并使用以下代码(如Remove punctuation from Unicode formatted strings所示):

import regex

def punc(text):
    return regex.sub(ur"\p{P}+", " ", text)

我想更进一步,尝试选择性地保留某些标点符号。例如,无需从unicode字符串中删除-。最好的方法是什么?提前致谢! :)

2 个答案:

答案 0 :(得分:3)

您可以使用\p{P}否定\P{P}然后将其放入否定字符类([^…])以及您要保留的任何字符,如下所示:

return regex.sub(ur"[^\P{P}-]+", " ", text)

这将匹配\p{P}中的一个或多个字符,但在字符类中定义的字符除外。

请记住-是角色类中的特殊字符。如果它没有出现在角色类的开头或结尾,你可能需要逃避它。


另一种解决方案是使用否定前瞻((?!…))或否定后瞻((?<!…)

return regex.sub(ur"((?!-)\p{P})+", " ", text)

return regex.sub(ur"(\p{P}(?<!-))+", " ", text)

但对于这样的事情,我建议使用角色类。

答案 1 :(得分:1)

您可以使用character class

def punc(text):
    return regex.sub(ur"[^\P{P}-]+", " ", text)

诀窍是否定字符类([^a]匹配除 a之外的任何)并使用否定的Unicode属性:

  • 我们将\p{P}替换为[^\P{P}] - 两者的行为完全相同。
  • 现在我们可以在匹配的类中添加字符:[^\P{P}-]匹配除-之外的任何标点字符。