是否可以使用正则表达式删除文本中的小词?例如,我有以下字符串(文本):
anytext = " in the echo chamber from Ontario duo "
我想删除所有 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