Regex

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
MaximilianB
User
Beiträge: 1
Registriert: Sonntag 28. Juli 2019, 13:26

Liebe Forumsmitglider,

heiße Max und bin seit gerade angemeldet. Mit Python habe ich noch relativ wenig Erfahrung gesammelt und wende mich deshalb nun an euch.

Im Unternehmen verwenden wir eine Software zur Verschnittoptimierung von Plattenwerkstoffen. Hier müssen alle werte einzeln eingetragen werden.
Zufällig habe ich herausgefunden, dass die von der Software erzeugten Dateien nichts anderes als .txt-Files sind.

Hier nun mein gedankengang:

Aus unserer, bestehenden Stückliste möchte ich alle relevanten Daten in eine Liste in Python einlesen. Das hat soweit nun funktioniert.
In einer weiteren Liste hinterlege ich nun verschiedene Materialien.

Hier kommt nun mein Problem auf:

Ich möchte eine Regex bilden.

Über eine for-Schleife möchte ich nun versuchen die Liste, in welcher die Werte aus der Excel-Tabelle mittels einer Regex auf "Schnipsel" überprüfen, welche in der Liste mit den Materialien stehen.

Alles In allem soll der Fertige Code nichts anderes sein als ein Vehikel um Daten von Excel in dieses Programm zu Importieren. Den Rest habe ich noch nicht verfasst.

Würde mich über eine kleine hilfestellung sehr freuen und hoffe dass ich euch nicht allzusehr mit Text gelangweilt habe.

Vielen Dank an euch alle =D

im Folgenden Mein Codeansatz:

Code: Alles auswählen

import xlrd
import re


wb= xlrd.open_workbook('Excel_data.xls')
sheet= wb.sheet_by_index(0)
listeanzahl=[]
listeartikel=[]
listelaenge=[]
listebreite=[]
material=["Span","Multi","MDF","Vollkern","Melamin","Corian"]

ran=sheet.nrows

#auslesen der daten aus excel data
i=0
for i in range(ran-1):
    i=i+1
    listeanzahl.append(sheet.cell_value(i,1))
    listeartikel.append(sheet.cell_value(i,3))
    listelaenge.append(sheet.cell_value(i,7))
    listebreite.append(sheet.cell_value(i,8))

#übereinstimmungen finden

for i in range (ran-1):
    i = i+1
    übereinstimmung=re.search(material[0:5],sheet.cell_value(i,3))
Benutzeravatar
__blackjack__
User
Beiträge: 14045
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@MaximilianB: Du solltest Dir erst gar keine komischen Abkürzungen angewöhnen. Was soll `ran` bedeuten? Und warum wird das überhaupt an einen Namen gebunden? Ist ja nur ein anderer Name für `sheet.nrows`.

Typen von Grunddatentypen haben in Namen nichts verloren. Und Du solltest keine vier ”parallele” Listen führen. Daten die zusammen gehören, sollte man auch zusammen speichern. Also beispielsweise *eine* Liste in der Tupel mit den zusammengehörenden Daten gespeichert werden. Statt einfacher Tupel wäre hier ein `collections.namedtuple`-Datentyp angebracht, damit man den einzelnen Bestandteilen einen Namen geben kann und die nicht magische Indexzahlen bekommen.

Die Zuweisung von `i` vor der Schleife ist überflüssig.

Das mit dem `i` ist umständlich gelöst. Statt das von 0 bis ran - 2 laufen zu lassen um *in* der Schleife dann wieder 1 zu addieren, sollte man das gleich in der Schleife von 1 bis ran - 1 laufen lassen.

Edit: Warum holst Du die Werte in der zweiten Schleife wieder aus der Exceltabelle? Du hast die da doch bereits heraus geholt. Das sollte am besten auch auf Funktionen aufgeteilt werden, denn nach dem Einlesen muss ja auch das Objekt für die Exceltabelle nicht mehr existieren.

Wenn Du einen regulären Ausdruck aus literalen Werten machen möchtest, dann müsstest Du sicherstellen, das kein Teil davon Zeichen enthält die in regulären Ausdrücken eine besondere Bedeutung haben, das geht mit `re.escape()`, und dann daraus einen regulären Ausdruck erstellen bei dem die einzelnen Teile Alternativen sind – also durch '|' getrennt. Das macht man natürlich nicht in jedem Schleifendurchlauf wenn sich dieses Zwischenergebnis nicht ändert, sondern *einmal* *vor* der Schleife.
„A life is like a garden. Perfect moments can be had, but not preserved, except in memory. LLAP” — Leonard Nimoy's last tweet.
Benutzeravatar
__blackjack__
User
Beiträge: 14045
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Ungetestet:

Code: Alles auswählen

#/usr/bin/env python3
from collections import namedtuple
import re

import xlrd


Piece = namedtuple('Piece', 'count article length width')


def read_pieces(filename):
    with xlrd.open_workbook(filename) as workbook:
        sheet = workbook.sheet_by_index(0)
        
        rows = sheet.get_rows()
        next(rows)  # Skip first row.
        for row in rows:
            yield Piece(*(cell.value for cell in row[i] for i in [1, 3, 7, 8]))


def main():
    pieces = list(read_pieces('Excel_data.xls'))

    materials = ['Span', 'Multi', 'MDF', 'Vollkern', 'Melamin', 'Corian']
    regex = re.compile('|'.join(map(re.escape, materials)))
    for piece in pieces:
        if regex.search(piece.article):
            print(piece)
    


if __name__ == '__main__':
    main()
„A life is like a garden. Perfect moments can be had, but not preserved, except in memory. LLAP” — Leonard Nimoy's last tweet.
Antworten