使用Python删除小词

时间:2012-09-27 19:46:30

标签: python regex

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

anytext = " in the echo chamber from Ontario duo "

我想删除所有不超过3个字符的单词。结果应该是:

"echo chamber from Ontario"

是否可以使用正则表达式或任何其他python函数?

感谢。

2 个答案:

答案 0 :(得分:41)

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

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

答案 1 :(得分:28)

当然,它也不是那么难:

shortword = re.compile(r'\W*\b\w{1,3}\b')

上面的表达式选择任何前面有一些非单词字符(基本上是空格或开头)的单词,短于1到3个字符,并以单词边界结束。

>>> shortword.sub('', anytext)
' echo chamber from Ontario '

此处\b边界匹配很重要,它们可确保您不匹配单词的第一个或最后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