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

如何在Python中将具有数字范围的字符串转换为列表,python,string,list,range,Python,String,List,Range,我想听听你的反馈。 我需要处理定义为字符串的范围内的输入: 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(

我想听听你的反馈。 我需要处理定义为字符串的范围内的输入:

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')))
请问,你能告诉我有一种更优雅的方式还是一种通灵的方式吗
做同样的事吗。。。使用导入模块!谢谢。

列表理解结合一些字符串拼接是一种不导入任何内容的方法:

targets = 'machine[7:10]'

start_idx = targets.index('[')
separator_idx = targets.index(':')
end_idx = targets.index(']')

name = targets[:start_idx]
range_start = int(targets[start_idx + 1:separator_idx])
range_end = int(targets[separator_idx + 1:end_idx]) + 1

results = [name + "{:02}".format(i) for i in range(range_start, range_end)]

print(results)

列表理解结合一些字符串拼接是一种不导入任何内容的方法:

targets = 'machine[7:10]'

start_idx = targets.index('[')
separator_idx = targets.index(':')
end_idx = targets.index(']')

name = targets[:start_idx]
range_start = int(targets[start_idx + 1:separator_idx])
range_end = int(targets[separator_idx + 1:end_idx]) + 1

results = [name + "{:02}".format(i) for i in range(range_start, range_end)]

print(results)
您可以使用:

您可以使用:


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

然后在range对象上运行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']

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

然后在range对象上运行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']

您已经在代码中使用了
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))

您已经在代码中使用了
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))
试试这个

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']
试试这个

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']

首先分为射程和目标:

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']

首先分为射程和目标:

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']

我更喜欢可读性更强的东西,尝试使用格式化字符串的新方法,这会让一切变得更清晰

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']
targets='machine[7:10]'
结果=[]
名称,范围=targets.split(“[”)
idx=[int(x)表示范围_[:-1]中的x。拆分(':')]
对于范围内的i(idx[0],idx[1]+1):
如果i<10:
results.append(f'{name}0{i}')
其他:
results.append(f'{name}{i}')
>>>结果
>>>['machine07','machine08','machine09','machine10']

我更喜欢可读性更强的东西,尝试使用格式化字符串的新方法,它可以让一切变得更清晰

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']
targets='machine[7:10]'
结果=[]
名称,范围=targets.split(“[”)
idx=[int(x)表示范围_[:-1]中的x。拆分(':')]
对于范围内的i(idx[0],idx[1]+1):
如果i<10:
results.append(f'{name}0{i}')
其他:
results.append(f'{name}{i}')
>>>结果
>>>['machine07','machine08','machine09','machine10']

稍等片刻,我无意中点击了submit。我正在编辑我的答案。好吧,但您使用的是硬编码值…例如
机器
7,11
!我应该指定从字符串本身提取信息。如果我的字符串是:
服务器[1:25]
!@Ep1cF4iL Refresh查看我的解决方案。请稍等,我不小心点击了submit。我正在编辑我的答案。好吧,但您使用的是硬编码值…例如
机器
7,11
!我应该指定从字符串本身提取信息。如果我的字符串是:de>server[1:25]!@Ep1cF4iL刷新以查看我的解决方案。没有导入模块-
re
不是导入的模块吗?我猜他们的意思是“不需要安装额外的库”是的,我的错误导入是允许的,没有导入模块-
re
不是导入的模块吗?我猜他们的意思是“不需要安装额外的库”是的,我的错误导入是允许的