捕获最多三位数的所有数字

11 python regex string

我有以下字符串:

1 2 134 2009
Run Code Online (Sandbox Code Playgroud)

而且我想捕获1-3个数字之间的字符串,因此结果应该是:

['1', '2', '134']
Run Code Online (Sandbox Code Playgroud)

我现在拥有的那些,但也捕获包含超过3位数的字符串中的"前3"数字.这是我目前的正则表达式:

>>> re.findall(r'\d{1,3}', '1 2 134 2009')
['1', '2', '134', '200', '9']

# or a bit closer --

>>> re.findall(r'\d{1,3}(?!\d)', '1 2 134 2009')
['1', '2', '134', '009']
Run Code Online (Sandbox Code Playgroud)

什么是确保另一个数字不立即进行的正确方法?

tim*_*geb 12

如果字符串中只有用空格分隔的数字,则使用re是过度杀伤.您可以简单地split使用字符串并检查子字符串的长度.

>>> numbers = '1 2 134 2009'
>>> [n for n in numbers.split() if len(n) <= 3]
>>> ['1', '2', '134']
Run Code Online (Sandbox Code Playgroud)


Dan*_*ejo 11

添加单词边界:

import re

result = re.findall(r'\b\d{1,3}\b', '1 2 134 2009')

print(result)
Run Code Online (Sandbox Code Playgroud)

产量

['1', '2', '134']
Run Code Online (Sandbox Code Playgroud)

文档 \b:

匹配空字符串,但仅匹配单词的开头或结尾.单词被定义为单词字符序列.请注意,正式地,\ b被定义为\ w和\ W字符之间的边界(反之亦然),或者在\ w和字符串的开头/结尾之间.这意味着r'\ bfoo\b'匹配'foo','foo.','(foo)','bar foo baz'但不匹配'foobar'或'foo3'.

默认情况下,Unicode字母数字是Unicode模式中使用的字母数字,但可以使用ASCII标志更改.如果使用LOCALE标志,则字边界由当前区域设置确定.在字符范围内,\ b表示退格符,以便与Python的字符串文字兼容.