RegEx用于匹配除标点符号以外的所有非单词?

时间:2016-12-24 08:22:53

标签: python regex python-3.x replace

对于这样的句子:

sent = "This i$s a s[[]ample sentence.\nAnd another <<one>>.
        \nMoreover, it is 'filtered'!"

我想得到:

"This is a sample sentence. And another one. Moreover, it is filtered."

因此,我认为使用re.sub应该是可行的方法。但是,RegEx并没有像预期的那样工作(就像它几乎总是这样)。

我的想法是使用\W匹配每个非单词,然后排除[.,;!?]以保留标点符号。我尝试的最后一个RegEx是:

re.sub(r"(\W[^\.\,\;\?\!])", "", sent)

不幸的是,[^\.\,\;\?\!]确实与任何不包含[.,;!?]条目的内容相匹配,而不是简单地说 匹配这些字符&#39} ;

如何从匹配中排除这些字符?

1 个答案:

答案 0 :(得分:1)

\W需要集成到否定的字符类中。 \W[^\w]相同,因此您最终会得到[^\w.,;!?]。您应该重复此字符类,以便在一个步骤中匹配连续出现的事件 - [^\w.,;!?]+

您似乎也希望保留空格,因此您应该将它们添加到角色类中。

深入研究您的问题,您还希望用空格替换换行符,用!替换.。这使它成为一个多步骤的解决方案。首先过滤掉所有不需要的[^\w.,;!? \n]+,然后在下一步中将\n替换为,将!替换为.