【问题标题】:Remove small words using Python使用 Python 删除小单词
【发布时间】:2012-09-27 19:46:30
【问题描述】:

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

anytext = " in the echo chamber from Ontario duo "

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

"echo chamber from Ontario"

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

谢谢。

【问题讨论】:

  • 我已将 echo 添加到您的预期输出中,因为它短 4 个字符。 :-)
  • @MartijnPieters -- 您可能还想将“少于 3 个字符”更改为“少于 4 个字符”——这样语法正确且一致。
  • @mgilson:我更有创意,改为3个字符或更少

标签: python regex


【解决方案1】:

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

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

【讨论】:

  • 嗯...我认为这是我迄今为止获得民粹主义徽章的最佳机会 :)
  • 呜呼,民粹主义者!谢谢大家——现在你可以再次开始投票 Martijn 的回答了 ;-)
【解决方案2】:

当然,也没有那么难:

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

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

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

\b 边界匹配在这里很重要,它们确保您不会只匹配单词的前三个字符。

开头的\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

【讨论】:

  • 特别是因为 OP 中的第一行是:“是否可以使用 regex 删除...” +1 正义跨度>
  • @jedwards -- 正义万岁!
  • 这个解决方案也很有效。这两种解决方案都非常适合。谢谢
  • @ThomasBryan:选择最适合你的;我添加了一些信息来帮助您做出决定。 :-)
  • @MartijnPieters 感谢您的精彩解释
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-01
相关资源
最近更新 更多