Python 从字符串中删除长度小于4的单词
我正在尝试从字符串中删除长度小于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
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快得多