如何使用 python 从列表中增加数字和字母数字字符串?
how to increment numeric and alphanumeric string from list using python?
给定列表 n = ['4276-4279', 'I69-I71', 'V104-V112', '11528']
从上面的列表中,我想用连字符匹配字符串并将数字或字母数字值增加到给定范围。
到目前为止,我只能使用 RE 来匹配值。 p = re.compile('([\d]|[A-Z\d]{1,})[-]')
预期输出:['4276'、'4277'、'4278'、'4279'、'I69'、'I70'、'I71'、'V104'、'V105', 'V106', 'V107', 'V108', 'V109', 'V110', 'V111', 'V112', '11528' ]
谢谢。
import re
n = ['4276-4279', 'I69-I71', 'V104-V112', '11528']
big_list=[]
for item in n:
print(item)
if '-' in item:
part1,part2=item.split("-")
if part1.isnumeric() and part2.isnumeric():
big_list.extend([x for x in range(int(part1),int(part2))])
continue
if part1.isalnum() and part2.isalnum():
list1=re.findall(r"[^\W\d_]+|\d+", part1)
list2=re.findall(r"[^\W\d_]+|\d+", part2)
print(list1,list2)
temp_list=[]
for i in range(int(list1[1]),int(list2[1])):
temp_list.append(list1[0]+str(i))
big_list.extend(temp_list)
else:
if item.isnumeric():
big_list.append(int(item))
else:
big_list.extend(item)
print(big_list)
此代码适用于我的输入。
请尝试并告诉我它是否有效。
您可以处理列表中的每个元素,看它是否与模式匹配
^([A-Z]*)(\d+)-(\d+)$
即一个可选的字母、一些数字、一个连字符 (-
)、重复的字母(如果存在)以及最后一些数字。
如果是,您可以从第 2 组和第 3 组生成 range
,并将第一组添加到从该范围生成的每个值:
import re
lst = ['4276-4279', 'I69-I71', 'V104-V112', '11528']
new = []
for l in lst:
m = re.match(r'^([A-Z]*)(\d+)-(\d+)$', l)
if m:
new += [m.group(1) + str(i) for i in range(int(m.group(2)), int(m.group(3))+1)]
else:
new += [l]
print(new)
输出:
['4276', '4277', '4278', '4279', 'I69', 'I70', 'I71', 'V104', 'V105', 'V106', 'V107', 'V108', 'V109', 'V110', 'V111', 'V112', '11528']
给定列表 n = ['4276-4279', 'I69-I71', 'V104-V112', '11528']
从上面的列表中,我想用连字符匹配字符串并将数字或字母数字值增加到给定范围。 到目前为止,我只能使用 RE 来匹配值。 p = re.compile('([\d]|[A-Z\d]{1,})[-]')
预期输出:['4276'、'4277'、'4278'、'4279'、'I69'、'I70'、'I71'、'V104'、'V105', 'V106', 'V107', 'V108', 'V109', 'V110', 'V111', 'V112', '11528' ]
谢谢。
import re
n = ['4276-4279', 'I69-I71', 'V104-V112', '11528']
big_list=[]
for item in n:
print(item)
if '-' in item:
part1,part2=item.split("-")
if part1.isnumeric() and part2.isnumeric():
big_list.extend([x for x in range(int(part1),int(part2))])
continue
if part1.isalnum() and part2.isalnum():
list1=re.findall(r"[^\W\d_]+|\d+", part1)
list2=re.findall(r"[^\W\d_]+|\d+", part2)
print(list1,list2)
temp_list=[]
for i in range(int(list1[1]),int(list2[1])):
temp_list.append(list1[0]+str(i))
big_list.extend(temp_list)
else:
if item.isnumeric():
big_list.append(int(item))
else:
big_list.extend(item)
print(big_list)
此代码适用于我的输入。 请尝试并告诉我它是否有效。
您可以处理列表中的每个元素,看它是否与模式匹配
^([A-Z]*)(\d+)-(\d+)$
即一个可选的字母、一些数字、一个连字符 (-
)、重复的字母(如果存在)以及最后一些数字。
如果是,您可以从第 2 组和第 3 组生成 range
,并将第一组添加到从该范围生成的每个值:
import re
lst = ['4276-4279', 'I69-I71', 'V104-V112', '11528']
new = []
for l in lst:
m = re.match(r'^([A-Z]*)(\d+)-(\d+)$', l)
if m:
new += [m.group(1) + str(i) for i in range(int(m.group(2)), int(m.group(3))+1)]
else:
new += [l]
print(new)
输出:
['4276', '4277', '4278', '4279', 'I69', 'I70', 'I71', 'V104', 'V105', 'V106', 'V107', 'V108', 'V109', 'V110', 'V111', 'V112', '11528']