2012-09-27 192 views
15

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

anytext = " in the echo chamber from Ontario duo " 

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

"echo chamber from Ontario" 

是否有可能使用正则表达式或任何其他Python函数吗?

谢谢。

+1

我添加了'echo'您预期的输出,因为它是4个字符的短。 :-) –

+1

@MartijnPieters - 您可能还希望将“少于3个字符”更改为“少于4个字符” - 只要语法正确并且全部一致。 – mgilson

+2

@mgilson:我比较有创意,并且使* 3个字符或更少*。 –

回答

26

当然,这并不难之一:

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 
+2

尤其是因为OP中的第一行是:“是否有可能使用***正则表达式***来移除...”+1正义 – jedwards

+0

@jedwards - Horray for justice! – mgilson

+0

该解决方案也很好。这两种解决方案都很适合。谢谢 – Thomas

41

我不认为你需要反正这个简单的例子,一个正则表达式...

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

完美!谢谢 – Thomas

+0

嗯......我认为这是获得民粹主义徽章到目前为止的最佳机会:) – mgilson

+0

+1 upvoting所以你可以得到你的民粹主义者。 – hughdbrown