从Unicode字符串中移除选定的标点符号

2 投票
2 回答
576 浏览
提问于 2025-04-18 12:31

我正在处理一组unicode字符串,并使用以下这段代码(如从Unicode格式字符串中移除标点符号所示):

import regex

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

我想更进一步,尝试选择性地保留某些标点符号。例如,-这个符号在unicode字符串中不需要被移除。有什么好的方法可以做到这一点吗?提前谢谢!:)

2 个回答

1

你可以使用一个叫做字符类的东西来实现这个功能:

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

这里的窍门是要对字符类进行取反([^a]表示匹配任何除了 a以外的东西),同时使用取反的Unicode属性:

  • 我们把 \p{P} 替换成 [^\P{P}] - 这两者的效果是完全一样的。
  • 现在我们可以往这个字符类里添加一些不想匹配的字符:[^\P{P}-]表示匹配任何标点符号,但-除外。
3

你可以用 \P{P} 来表示不包含标点符号的字符,然后把它放在一个否定的字符类中(也就是 [^…]),再加上你想保留的其他字符,像这样:

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

这样就能匹配一个或多个的任何字符,只要这些字符不是标点符号,并且不在你定义的字符类里面。

记住,- 在字符类中是个特殊字符。如果它不在字符类的开头或结尾,你可能需要对它进行转义处理。


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

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

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

不过对于这种情况,我更推荐使用字符类的方法。

撰写回答