擅长:python、mysql、java
<p>当然,也没那么难:</p>
<pre><code>shortword = re.compile(r'\W*\b\w{1,3}\b')
</code></pre>
<p>上面的表达式选择任何前面有一些非单词字符(基本上是空白或开头)的单词,短1到3个字符,并以单词边界结尾。</p>
<pre><code>>>> shortword.sub('', anytext)
' echo chamber from Ontario '
</code></pre>
<p>在这里,<code>\b</code>边界匹配非常重要,它们确保您不会只匹配单词的前3个字符或后3个字符。</p>
<p>开头的<code>\W*</code>允许删除单词和前面的非单词字符,以便句子的其余部分仍然匹配。注意,标点符号包含在<code>\W</code>中,如果您只想删除前面的空白,请使用<code>\s</code>。</p>
<p>值得一提的是,这个正则表达式解决方案在其余单词之间保留了额外的空格,而mgilson的版本将多个空格字符压缩为一个空格。不知道这对你是否重要。</p>
<p>他的列表理解解决方案<em>是</em>两种方法中速度更快的:</p>
<pre><code>>>> 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
</code></pre>