Python 从字符串中删除长度小于4的单词

Python 从字符串中删除长度小于4的单词,python,regex,Python,Regex,我正在尝试从字符串中删除长度小于4的单词 我使用这个正则表达式: re.sub(' \w{1,3} ', ' ', c) 虽然这会删除一些字符串,但当长度小于4的2-3个单词同时出现时,它会失败。比如: I am in a bank. 它给了我: I in bank. 如何解决这个问题?不包括空格;改用\b单词边界锚定: re.sub(r'\b\w{1,3}\b', '', c) 这将完全删除最多3个字符的单词: >>> import re >>&g

我正在尝试从字符串中删除长度小于4的单词

我使用这个正则表达式:

 re.sub(' \w{1,3} ', ' ', c)
虽然这会删除一些字符串,但当长度小于4的2-3个单词同时出现时,它会失败。比如:

 I am in a bank.
它给了我:

 I in bank. 

如何解决这个问题?

不包括空格;改用
\b
单词边界锚定:

re.sub(r'\b\w{1,3}\b', '', c)
这将完全删除最多3个字符的单词:

>>> import re
>>> re.sub(r'\b\w{1,3}\b', '', 'The quick brown fox jumps over the lazy dog')
' quick brown  jumps over  lazy '
>>> re.sub(r'\b\w{1,3}\b', '', 'I am in a bank.')
'    bank.'

如果您想要regex的替代方案:

new_string = ' '.join([w for w in old_string.split() if len(w)>3])

由Martijn回答,但我只是想解释为什么你的正则表达式不起作用。正则表达式字符串
'\w{1,3}'
匹配一个空格,后跟1-3个单词字符,后跟另一个空格。
I
不匹配,因为它前面没有空格。替换
am
,然后正则表达式引擎从下一个不匹配的字符开始:在
中的
i
。它在
中看不到
前面的空格,因为它是由替换放置在那里的。因此,它找到的下一个匹配项是
a
,它将生成您的输出字符串。

您将删除最多10个字符的单词;不是3。如果要删除长度小于4的单词,为什么要使用
{1,10}
限定?如果要删除长度小于4的单词,为什么要使用
{1,10}
?很抱歉出现此错误。编辑了这个问题。
r'\b\w{,3}\b'
将是一个较短的问题。是否可以在bank之前删除额外的空格?@AvinashRaj:当然,在
\b
边界之间没有1个字符的
\w
匹配。我试图离OP表达式更近一点。@wannaC:这使得表达式更复杂;我们可以在每个单词后或每个单词前删除一个可选空格,但要正确处理这个问题,需要使用
r'(?:\b\w{,3}\s{,3}\s\w{,3}\b}\b\w{,3}\b)
三方。@PhokChanrithisak:使用字符串模板
r“\b\w{1,%d}\b”%(变量,)
也许。
$python-mtimeit-s'import-pytest''pytest.plain()'200000个循环,每循环5:1.36 usec的最佳值$python-mtimeit-s'import-pytest''pytest.reg_-ex()'100000个循环,每循环5:3.6 usec的最佳值
此版本比使用reg-ex快得多