从Unicode字符串中移除选定的标点符号
我正在处理一组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)
不过对于这种情况,我更推荐使用字符类的方法。