从带有循环和条件的列表中选择某些元素



我有一个类似于下面的列表,但是更大.

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

相关内容

  • 没有找到相关文章

最新更新