是否可以使用正则表达式删除文本中的小词?例如,我有以下字符串(文本):
anytext = " in the echo chamber from Ontario duo "
我想删除所有不超过3个字符的单词。结果应该是:
"echo chamber from Ontario"
是否可以使用正则表达式或任何其他python函数?
感谢。
答案 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