我在靶场上做了很多工作,在这件事上我遇到了麻烦。我在试着把范围扩大到完整的数字列表。
string = '1,2,3-6,10'
print string
我希望打印字符串的结果是'1,2,3,4,5,6,10‘。所以基本地展示了整个范围。
因此,主要问题是如何使用python将3-6转化为3,4,5,6。
任何帮助都将不胜感激!
发布于 2017-11-09 02:07:43
我认为这会输出你所需要的,它有点长,但是演示了这个过程。
string = '1,2,3-6,10'
splt_a = string.split(",")
o = []
for s in splt_a:
if "-" in s:
splt_b = s.split("-")
for i in range(int(splt_b[0]), int(splt_b[1]) + 1):
o.append(i)
else:
o.append(int(s))
print(o) # [1, 2, 3, 4, 5, 6, 10]
发布于 2017-11-09 02:07:22
您可以使用regex模式查找每个范围,并使用一个函数将范围替换为数字列表:
import re
s = '1,2,3-6,10'
def replace_range_by_ints(m):
a = m.group(1)
b = m.group(2)
return ','.join(str(i) for i in range(int(a), int(b) + 1))
pattern = re.compile('(\d+)\-(\d+)')
print(re.sub(pattern, replace_range_by_ints, s))
# 1,2,3,4,5,6,10
发布于 2017-11-09 02:11:11
如果检测到-
(有边界固定),一行将创建一个范围,否则只会将其转换为整数:
import itertools
result = [x for y in '-1,1,2,3-6,10'.split(",") for x in (range(int(y.split("-")[0]),int(y.split("-")[1])+1) if y.find("-")>0 else [int(y)]) ]
结果(作为整数列表):
[-1, 1, 2, 3, 4, 5, 6, 10]
请注意,它也处理负数(y.find("-")>0
确保-
在检测范围时不处于起始位置),但不处理负范围(必须为此选择另一个分隔符,如:
)。
https://stackoverflow.com/questions/47198876
复制