如何将带有数字范围的字符串转换为Python中的列表

时间:2017-02-10 12:51:45

标签: python string list range

我想要你的反馈。 我需要处理一个输入,这个输入是一个定义为string的范围:

targets = 'machine[7:10]'

我需要的结果是:

results = ['machine07', 'machine08', 'machine09', 'machine10']

以下是我用Python编写的代码:

for target in targets:

    m = re.search('\\d+:\d+\]', target)
    if m:
        name = target.split('[')[0]
        target_range = re.findall('[0-9]+', target)
        print(target_range)
        target_range = [int(i) for i in target_range]
        for tgt in range(target_range[0],target_range[1]+1):
             results.append(name + str(format(tgt, '02d')))

拜托,您能告诉我是否有更强烈的优雅方式或 pythonic 方式 做同样的事情? ...使用 NO 导入模块!谢谢。

7 个答案:

答案 0 :(得分:2)

在3组中捕获所需的子串。通过将最后两个组转换为int来生成范围对象。

然后在范围对象上运行for循环并追加到第一组。

您可以尝试这样的事情:

import re

targets = 'machine[7:10]'
a,b,c = re.findall(r'(.*?)\[(\d+):(\d+)\]', targets)[0]
res = [a+'{:0>2}'.format(d) for d in range(int(b),int(c)+1)]
print res

输出:

['machine07', 'machine08', 'machine09', 'machine10']

答案 1 :(得分:1)

您可以使用groups

> targets = 'machine[7:10]'
> m = re.match(r'(\w+)\[(\d+):(\d+)\]', targets)
> results = ['{}{:0>2}'.format(m.group(1), str(i)) for i in range(int(m.group(2)), int(m.group(3))+1)]
> results
['machine07', 'machine08', 'machine09', 'machine10']

答案 2 :(得分:0)

列表理解与一些字符串拼接相结合是一种方法,无需导入任何内容:

SelectedIndex

答案 3 :(得分:0)

您已经在代码中使用了split(),为什么不采取更进一步的步骤并消除对re的需求?

(base, indices) = targets.split('[')
(start, end) = indices[:-1].split(':')

target_range = []
for i in range(int(start), int(end)+1):
    target_range.append('{0}{1:02}'.format(base, i))

答案 4 :(得分:0)

试试这个,

word,nums_ = targets.split('[')
nums = map(int,nums_.replace(']','').split(':'))
nums[-1] = nums[-1]+1
print [word+'{:0>2}'.format(i) for i in range(*nums)]

结果

['machine07', 'machine08', 'machine09', 'machine10']

答案 5 :(得分:0)

首先分为范围和目标:

target, ranges = targets[:-1].split('[')

然后得到低和高范围:

range_min, range_max = [int(i) for i in ranges.split(':')]

然后遍历范围并创建字符串:

results = ['{}_{:0>2}'.format(target, i) for i in range(range_min, range_max + 1)]

结果:

['machine_07', 'machine_08', 'machine_09', 'machine_10']

答案 6 :(得分:0)

我更喜欢更具可读性的东西,尝试使用格式化字符串的新方法,它使一切都清晰。

targets = 'machine[7:10]'
results = []

name, range_ = targets.split('[')
idx = [int(x) for x in range_[:-1].split(':')]

for i in range(idx[0],idx[1]+1):
    if i < 10:
        results.append(f'{name}0{i}')
    else:
        results.append(f'{name}{i}')

>>>results
>>>['machine07', 'machine08', 'machine09', 'machine10']