我有一个类似于下面的列表,但是更大.
mylist = [' 12345678912 ST',
' Halterung für Fortlüfterhaube',
' Material/Werkstoff: Metall-Lackiert',
' **Beginn Zeichnung**',
' 98765432164 ST',
' Klappe, komplett',
' **Beginn Zeichnung**',
' 74563254671 ST',
' Sieb Außen-Dm 145 x 0,8mm',
' Versatz Dm 122 x 5mm tief',
' Material: Niro 1.4301 - Lochblech Dm1/LA1,5mm',
' 90876487921 M',
' Gista-Profil',
' mit Moosgummihohlkammer-Dichtung (EPDM)',
' Farbe: schwarz, Klemmbereich: 1-2 mm',
' Material: EPDM, 60 +/- 5 Shore A,',
' 64352647971 ST',
' Winkelblech für Frost Erdungskontakt (AB 434 l)',
' für TGr. 78.2',
' Winkelblech für Frost Erdungskontakt (AB 434 l)',
' für TGr. 78.2',
' für TGr. 78.2',
' Material/Werkstoff: X5CrNi 1810']
我的目标是提取列表中每个ID(以及ID本身)的Material名称(如果存在)。
我使用了以下代码:
Materials = []
iteration_list = mylist
for item in iteration_list:
if str(item).strip().startswith("Material"):
material_index = iteration_list.index(item)
ID = "".join(re.findall(r'd+', str(iteration_list[material_index - 1])))
if len(ID) != 11:
ID = "".join(re.findall(r'd+', str(iteration_list[material_index - 2])))
if len(ID) != 11:
ID = "".join(re.findall(r'd+', str(iteration_list[material_index - 3])))
Materials.extend([ID, item])
产生如下:
['12345678912',
' Material/Werkstoff: Metall-Lackiert',
'74563254671',
' Material: Niro 1.4301 - Lochblech Dm1/LA1,5mm',
'90876487921',
' Material: EPDM, 60 +/- 5 Shore A,',
'64352647971',
' Material/Werkstoff: X5CrNi 1810']
所以我首先寻找材料,然后试图提取各自的ID。我目前面临的问题是,材料被随机定位在每个ID下面,它变得复杂/丑陋与IF语句获得基于相对于材料索引的索引的ID。
我的问题是,是否有可能以某种方式在每个找到的材料上面找到ID(11位数字),而不编写许多if语句来捕获所有可能的变化。(ID总是11位长的) .
不需要从Material行搜索到前面的ID行,只需记住在变量中遇到的每个ID。然后,当您到达Material行时,mid
变量保存它之前的最后一个ID的值。
materials = []
for line in mylist:
line = line.strip()
m = re.match(r'd{11}b', line)
if m:
mid = m.group()
elif line.startswith("Material"):
materials.append([mid, line])
按照Barmar的回答:
data = []
for line in mylist:
if (m := re.match(r's*(d{11})', line)):
data.append((m.group(1), []))
elif data and (m := re.match(r'^s*Material:s*(.+)$', line)):
data[-1][1].append(m.group(1))
data = [d for d in data if d[1]]
结果:
[('74563254671', ['Niro 1.4301 - Lochblech Dm1/LA1,5mm']),
('90876487921', ['EPDM, 60 +/- 5 Shore A,'])]