re.findall Problem

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
frosch
User
Beiträge: 10
Registriert: Donnerstag 17. September 2009, 09:17

Hi,

ich bin was Python betrifft ein ziemlicher Anfänger.
Ich möchte ein Programm schreiben, dass mir aus einer Datei alle Fehlermeldungen, die wie folgt aufgebaut sind ausliest und dann je Meldung gruppiert.
|Typ| Nr|Meldungstext |
|-----------------------------------------------------------------------------------------------------------------------------------|
|I |90030001|Mitteilung 18 für 31.12.2007: Wert in Feld KZ931 liegt unterhalb des zulässigen Bereichs ab 0.00 |
Der Meldungstext kann in der länge variieren, aber ist immer mit einem | beendet.

Code: Alles auswählen

for line in in_f: 
	mylist.append(line)

  #print len(mylist)
	
  while i < len(mylist):
	p = re.findall ('^\|(?P<Typ>\w) |(?P<Pernr>\d{8})| (?P<Meldung>\w?) |$',mylist[i])
	if p != []:
	   helplist.append(p)
	i=i+1
	
    
  print helplist
Mein Output:
[('W', '', ''), ('', '90034244', ''), ('', '', ''), ('', '', ''), ('',
'', ''), ('', '', ''), ('', '', ''), ('', '', ''), ('', '', ''), ('', '', ''), (
'', '', ''), ('', '', ''), ('', '', ''), ('', '', ''), ('', '', ''), ('', '', ''
), ('', '', ''), ('', '', ''), ('', '', ''), ('', '', ''), ('', '', ''), ('', ''
, ''), ('', '', ''), ('', '', ''), ('', '', ''), ('', '', ''), ('', '', ''), (''
, '', ''), ('', '', ''), ('', '', ''), ('', '', ''), ('', '', ''), ('', '', '')]

Warum sieht der Output nicht so aus:
[('w'),('90034244'),('Mitteilung 18 für 31.12.2007: Wert in Feld KZ931 liegt unterhalb des zulässigen Bereichs ab 0.00 ')]

LG
FROSCH
ms4py
User
Beiträge: 1178
Registriert: Montag 19. Januar 2009, 09:37

Kleiner Hinweis:
Du kannst mit

Code: Alles auswählen

for line in file:
direkt zeilenweise über die Datei iterieren ohne sie extra in einer Liste abzulegen.
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

frosch hat geschrieben:
|Typ| Nr|Meldungstext |
|-----------------------------------------------------------------------------------------------------------------------------------|
|I |90030001|Mitteilung 18 für 31.12.2007: Wert in Feld KZ931 liegt unterhalb des zulässigen Bereichs ab 0.00 |
Der Meldungstext kann in der länge variieren, aber ist immer mit einem | beendet.

Code: Alles auswählen

	p = re.findall ('^\|(?P<Typ>\w) |(?P<Pernr>\d{8})| (?P<Meldung>\w?) |$',mylist[i])
	if p != []:
	   helplist.append(p)
Du setzt re.findall ein ohne zu wissen was es tut. Dann stimmen ein paar Escapes auch nicht und zum Schluss kann man einfach alles bis zum letzten "|" nehmen.

Code: Alles auswählen

    p = re.match (r'^\|(?P<Typ>\w)\s*\|(?P<Pernr>\d{8})\|(?P<Meldung>[^\|]*)',mylist[i])
    if p:
        helplist.append(p.groups())
Dauerbaustelle
User
Beiträge: 996
Registriert: Mittwoch 9. Januar 2008, 13:48

Das geht auch ohne Regular Expressions:

Code: Alles auswählen

text = """
|Typ| Nr|Meldungstext |
|-----------------------------------------------------------------------------------------------------------------------------------|
|I |90030001|Mitteilung 18 fuer 31.12.2007: Wert in Feld KZ931 liegt unterhalb des zulaessigen Bereichs ab 0.00 |
"""

helplist = []

for line in text.split('\n'):
    try:
        typ, nr, meldungstext = (x.strip() for x in line[1:-1].split('|'))
    except ValueError:
        pass
    else:
        if typ.isalnum() and nr.isdigit() and meldungstext:
            helplist.append((typ, nr, meldungstext))

print helplist
# [('I', '90030001', 'Mitteilung 18 fuer 31.12.2007: Wert in Feld KZ931 liegt unterhalb des zulaessigen Bereichs ab 0.00')]
Antworten