Python正则表达式 - 删除特殊字符但保留撇号

5

我试图从一些文本中删除所有特殊字符,这是我的正则表达式:

pattern = re.compile('[\W_]+', re.UNICODE)
words = str(pattern.sub(' ', words))

这段代码非常简单,但是很不幸,在使用撇号(单引号)时会导致问题。例如,如果我有单词“doesn't”,这段代码会返回“doesn”。

有没有办法修改这个正则表达式,使其不会在这种情况下移除撇号?

编辑:这就是我想要的:

doesn't this mean it -technically- works?
应该是这样的:技术上讲,这不意味着它能正常工作吗?

首先,您需要定义“特殊字符”的含义。 - cha0site
所有被 [\W]+ 移除的内容。我会编辑我的帖子以使其更清晰明了。 - Hanpan
也许您想要做一些更高级的事情,而不仅仅是用空格替换非ASCII字符末尾? :-) - tobixen
4个回答

12
像这样吗?
>>> pattern=re.compile("[^\w']")
>>> pattern.sub(' ', "doesn't it rain today?")
"doesn't it rain today "

如果还需要过滤下划线:
>>> re.compile("[^\w']|_").sub(" ","doesn't this _technically_ means it works? naïve I am ...")
"doesn't this  technically  means it works  naïve I am    "

从问题中不太清楚是否需要这个,但这不会删除下划线。 - Andrew Clark
如果还需要删除下划线,那么情况会变得更加复杂。也许使用 a-zA-Z 的技巧会更好。我会尝试改进。 - tobixen
a-zA-Z无法工作,因为它不包括非ASCII字符...但是我已经解决了这个问题。 - tobixen

1
我能够使用这个正则表达式:[a-z]*'?[a-z]+将您的示例解析为单词列表。
然后,您可以使用空格将列表元素连接起来。

[a-zA-Z] 不支持国际字符。 - tobixen
>>> re.compile("[^a-zA-Z']").sub(" ","doesn't this -technically- means it works? naïve I am ...") => "这难道不是技术上可行的意思吗?我真是太天真了..." - tobixen
好观点。我只是做了一个简单的基本情况,因为他说得好像他不需要覆盖所有的边角情况。 - Mike Z

0

怎么样?

re.sub(r"[^\w' ]", "", "doesn't this mean it -technically- works?")

0

这个怎么样:([^\w']|_)+

请注意,这对于以下内容可能效果不佳:

doesn't this mean it 'technically' works?

这可能并不完全符合你的要求。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接