【问题标题】:Remove selected punctuation from unicode strings从 unicode 字符串中删除选定的标点符号
【发布时间】:2014-08-29 12:01:50
【问题描述】:
【问题讨论】:
标签:
python
regex
python-2.7
unicode
punctuation
【解决方案1】:
您可以将\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)
但对于这样的事情,我会推荐字符类。
【解决方案2】:
您可以为此使用character class:
def punc(text):
return regex.sub(ur"[^\P{P}-]+", " ", text)
诀窍是否定字符类([^a] 匹配任何除了 a)并使用否定的 Unicode 属性:
- 我们将
\p{P} 替换为 [^\P{P}] - 两者的行为完全相同。
- 现在我们可以将字符添加到应该不匹配的类:
[^\P{P}-] 匹配除- 之外的任何标点字符。