我有以下字符串:
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']
确保另一位数字不会立即继续处理的正确方法是什么?
答案 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的字符串文字兼容。