我有以下字符串:
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的字符串文字兼容.