如何将不同格式的字符串转换为整数列表?(python)

1 投票
5 回答
960 浏览
提问于 2025-04-16 20:52
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

撰写回答