Python正则表达式,删除unicode字符串中除连字符以外的所有标点

Python正则表达式,删除unicode字符串中除连字符以外的所有标点,python,regex,string,Python,Regex,String,我有以下代码用于删除正则表达式字符串中的所有标点: import regex as re re.sub(ur"\p{P}+", "", txt) 如何将其更改为允许连字符?如果你能解释一下你是怎么做到的,那就太好了。我明白,在这里,如果我错了,请纠正我,在标点符号后面加上任何符号。您可以指定要手动删除的标点符号,如在[.\u,]中,或者提供一个函数,而不是替换字符串: re.sub(r"\p{P}", lambda m: "-" if m.group(0) == "-" else ""

我有以下代码用于删除正则表达式字符串中的所有标点:

import regex as re    
re.sub(ur"\p{P}+", "", txt)

如何将其更改为允许连字符?如果你能解释一下你是怎么做到的,那就太好了。我明白,在这里,如果我错了,请纠正我,在标点符号后面加上任何符号。

您可以指定要手动删除的标点符号,如在

[.\u,]
中,或者提供一个函数,而不是替换字符串:

re.sub(r"\p{P}", lambda m: "-" if m.group(0) == "-" else "", text)
\p
\p
的补充,而不是标点符号。所以这匹配任何不匹配的东西(不是标点符号或破折号)-结果是除了破折号之外的所有标点符号

例如:

如果您想要一种不复杂的方式,另一种方法是
\p{p}(?:匹配所有标点,然后检查它不是破折号(使用负查找)。

工作示例:

以下是如何使用
re
模块,以防您必须坚持使用标准库:

#适用于python 2和3
进口稀土
导入字符串
删除=字符串。标点符号
移除=移除。替换(“-”,“”)#不移除连字符
pattern=r“[{}]”。格式化(删除)#创建模式
txt=“)*^%{}[]这是一个测试
re.sub(模式“”,txt)
#“这是一个测试”

如果性能很重要,您可能需要使用
str.translate
,因为。在Python3中,代码是
txt.translate({ord(char:None for char In remove})

太好了,谢谢。排除多个呢?例如“.”。@Anonymous-第一个是
[^\P{P}-.]+
,第二个是
\P{P}(?。非常简单。为什么现在必须在{P}之后加上“\”而不是在第一个?@Anonymous-好问题!这不是严格必要的-我通常更喜欢包含它。
-
在字符类中有空间意义,如
[a-z]
-它表示一个范围。我通常喜欢避开它,以避免潜在的错误。@Jerry-我看了一下,发现了这个:-这是
regex
,而不是
re
。我想他们有两个。@Kobi哦…我想这就解释了。
re
这里指的是有
\p
txt.translate({},chars\u-to\u-delete)
有更好的语法。
[^\P{P}-]+