如何将不同格式的字符串转换为整数列表?(python)
m = re.match(r'(\d+)(?:-(\d+))?$', string)
start = m.group(1)
end = m.group(2) or start
return list(range(int(start, 10), int(end, 10) + 1))
现在这个功能可以处理以下格式的字符串,并把它们转换成一个列表...
'0-6' 会变成 [0,1,2,3,4,5,6]
'7' 会变成 [7]
有没有办法让我改变这个表示法,以便也能处理以下格式的字符串...
'1 2 3 4 5' 会变成 [1,2,3,4,5]
5 个回答
1
m = re.match(r'(?:(\d+)(?:-(\d+))|(?:(\d+)(?:\s+|$))+)?$', string)
然后,在捕获的数据中查找第3组。
3
我建议你保持相同的写法,然后使用 re.findall()
来获取所有匹配的结果。举个例子:
import re
def to_num_list(instr):
out = []
for m in re.finditer(r'(\d+)(?:-(\d+))?', instr):
if m.group(2) == None:
out.append(int(m.group(1)))
else:
start = int(m.group(1))
end = int(m.group(2))
out.extend(xrange(start, end + 1))
return out
这样你就可以处理像 "1 2 3 10-15"
这样的输入了。下面是一个使用的例子:
>>> to_num_list("0-6")
[0, 1, 2, 3, 4, 5, 6]
>>> to_num_list("10")
[10]
>>> to_num_list("1 3 5")
[1, 3, 5]
>>> to_num_list("1 3 5 7-10 12-13")
[1, 3, 5, 7, 8, 9, 10, 12, 13]
并且可以跳过一些错误的输入(这可能不是你想要的):
>>> to_num_list("hello world 1 2 3")
[1, 2, 3]
>>> to_num_list("")
[]
>>> to_num_list("1 hello 2 world 3")
[1, 2, 3]
>>> to_num_list("1hello2")
[1, 2]
6
正则表达式并不是解决所有问题的唯一方法。在这种情况下,实际上没有必要使用正则表达式。试试这个方法,它的速度比例如Shawn Chin的 to_num_list
快了两倍多,特别是在样本数据 '0-6 2 3-6'
上(我尝试的所有数据中,它的速度大约快了1.9到4.5倍):
def included_numbers(s):
out = []
for chunk in s.split():
if '-' in chunk:
f, t = chunk.split('-')
out.extend(range(int(f), int(t)+1))
else:
out.append(int(chunk))
return out