我想要你的反馈。 我需要处理一个输入,这个输入是一个定义为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 导入模块!谢谢。
答案 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']