使用Python删除小词

使用Python删除小词,python,regex,Python,Regex,是否可以使用正则表达式删除文本中的小词?例如,我有以下字符串(文本): 我想删除所有3个字符或更少的单词。结果应该是: "echo chamber from Ontario" 是否可以使用正则表达式或任何其他python函数来实现这一点 谢谢。无论如何,对于这个简单的示例,我认为您不需要正则表达式 ' '.join(word for word in anytext.split() if len(word)>3) 当然,也没那么难: shortword = re.compile(r'\W

是否可以使用正则表达式删除文本中的小词?例如,我有以下字符串(文本):

我想删除所有3个字符或更少的单词。结果应该是:

"echo chamber from Ontario"
是否可以使用正则表达式或任何其他python函数来实现这一点


谢谢。

无论如何,对于这个简单的示例,我认为您不需要正则表达式

' '.join(word for word in anytext.split() if len(word)>3)

当然,也没那么难:

shortword = re.compile(r'\W*\b\w{1,3}\b')
上面的表达式选择前面有一些非单词字符(基本上是空格或开头)、长度在1到3个字符之间且在单词边界上结束的任何单词

>>> shortword.sub('', anytext)
' echo chamber from Ontario '
\b
边界匹配在这里很重要,它们确保您不会只匹配单词的前3个或后3个字符

开头的
\W*
允许您删除单词和前面的非单词字符,以便句子的其余部分仍然匹配。请注意,标点符号包含在
\W
中,如果只想删除前面的空白,请使用
\s

值得一提的是,这个正则表达式解决方案在其余单词之间保留了额外的空格,而mgilson的版本将多个空格字符压缩到一个空格中。不知道这对你是否重要

他的列表理解解决方案是两种方案中速度较快的:

>>> import timeit
>>> def re_remove(text): return shortword.sub('', text)
... 
>>> def lc_remove(text): return ' '.join(word for word in text.split() if len(word)>3)
... 
>>> timeit.timeit('remove(" in the echo chamber from Ontario duo ")', 'from __main__ import re_remove as remove')
7.0774190425872803
>>> timeit.timeit('remove(" in the echo chamber from Ontario duo ")', 'from __main__ import lc_remove as remove')
6.4250049591064453

我已将
echo
添加到您的预期输出中,因为它短4个字符。:-)@MartijnPieters——您可能还想将“少于3个字符”更改为“少于4个字符”——这样语法才是正确的,而且是一致的。@mgilson:我更具创造性,改为少于3个字符。特别是因为OP的第一行是:“是否可以使用正则表达式删除…”+1代表justice@jedwards--霍瑞,为了正义!这个解决方案也很有效。这两种解决方案都非常适合。Thanks@ThomasBryan:挑一个最适合你的;我添加了一些信息以帮助您做出决定。:-)@谢谢你的精彩解释。。。我认为这是我迄今为止获得民粹主义徽章的最好机会:)呜呼,民粹主义者!谢谢大家——现在你们可以再次开始投票表决Martijn的答案了;-)
>>> import timeit
>>> def re_remove(text): return shortword.sub('', text)
... 
>>> def lc_remove(text): return ' '.join(word for word in text.split() if len(word)>3)
... 
>>> timeit.timeit('remove(" in the echo chamber from Ontario duo ")', 'from __main__ import re_remove as remove')
7.0774190425872803
>>> timeit.timeit('remove(" in the echo chamber from Ontario duo ")', 'from __main__ import lc_remove as remove')
6.4250049591064453