Seite 1 von 1

re.findall Problem

Verfasst: Donnerstag 17. September 2009, 09:41
von frosch
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

Verfasst: Donnerstag 17. September 2009, 10:24
von ms4py
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.

Re: re.findall Problem

Verfasst: Donnerstag 17. September 2009, 12:35
von /me
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())

Verfasst: Donnerstag 17. September 2009, 12:57
von Dauerbaustelle
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')]