21

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

anytext = " in the echo chamber from Ontario duo "

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

"echo chamber from Ontario"

是否可以使用正则表达式或任何其他 python 函数来做到这一点?

谢谢。

4

2 回答 2

46

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

' '.join(word for word in anytext.split() if len(word)>3)
于 2012-09-27T19:47:28.087 回答
33

当然,这也不是那么难:

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
于 2012-09-27T19:49:50.973 回答