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

时间:2018-11-07 19:35:03

标签: python regex string

我有以下字符串:

1 2 134 2009

我想捕获1-3位数字之间的字符串,所以结果应该是:

['1', '2', '134']

我现在所捕获的内容,还捕获了包含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']

确保另一位数字不会立即继续处理的正确方法是什么?

2 个答案:

答案 0 :(得分:13)

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

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

答案 1 :(得分:12)

添加单词边界:

import re

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

print(result)

输出

['1', '2', '134']

来自documentation \b

  

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

     

默认情况下,Unicode字母数字是Unicode中使用的字母数字   模式,但是可以使用ASCII标志更改。字   如果LOCALE标志是   用过的。在字符范围内,\ b表示退格字符,   以便与Python的字符串文字兼容。