stimmt was nicht mit meiner regular expression?

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.
jo_hb
User
Beiträge: 72
Registriert: Donnerstag 26. April 2007, 09:21

stimmt was nicht mit meiner regular expression?

Beitragvon jo_hb » Sonntag 6. Mai 2007, 23:32

Hallo,
ich komm nicht weiter - ich lese .txt-files zeilenweise und brauche eine RE, die für diese vier fälle passt:

6.6
230
€18

Der vierte Fall ist ein einzelnes Space.

diese Zahlen / Werte & das Space stehen jeweils am Anfang der Zeile, direkt danach kommt ein newline; Ich habe nun die folgende RE gebastelt:

re.compile('(^\d+\.\d*\n|^.\d+\n|^ \n)')

...Und wie es aussieht treffe ich damit 6.6, 230 und das einzelne Space, aber ich krieg es nicht hin das auch die Zeile mit dem € trifft.

Hoffe ihr habt da ne Idee? Mach ich irgendeinen dämlichen Fehler?

Gruss,
Jo
jo_hb
User
Beiträge: 72
Registriert: Donnerstag 26. April 2007, 09:21

Beitragvon jo_hb » Montag 7. Mai 2007, 00:39

Aha, hab's doch geschafft:

re.compile('^\W*(\d+\.*\d*|\d+| )\n')

funktioniert. Lag wohl daran dass das Euro-zeichen aus drei ASCIIs besteht...

Gruss,
jo
BlackJack

Beitragvon BlackJack » Montag 7. Mai 2007, 09:53

Das Eurozeichen gibt's in ASCII nicht. Du meinst 3 Bytes, daraus besteht es zum Beispiel wenn der Text UTF-8 kodiert ist. Der Ausdruck passt jetzt auch auf alle Zeichenketten bei denen beliebige "nicht-Wort"-Zeichen von Ziffern gefolgt werden. Es wäre wohl sauberer direkt auf das Euro-Zeichen zu testen. Dazu kann man es entweder UTF-8 kodiert in den Ausdruck schreiben, dann muss es im Text aber auch immer so kodiert sein, oder man arbeitet mit Unicode-Zeichenketten, statt mit Bytes.

Bei Deinem Ausdruck können an einer Stelle auch beliebig viele '.' in der Zahl vorkommen, also '42.......23' würde auch erkannt werden.

Alternativ formuliert, aber immer noch mit dem '€'-Problem:

Code: Alles auswählen

import re

def main():
    test = ('6.6\n'
            '230\n'
            '\xe2\x82\xac18\n'  # UTF-8 coded EUR sign in front.
            ' \n'
            ' 42\n'
            '#+~23\n')
    regexp = re.compile(r'^\W*(\d+(?:\.\d*)?| )$', re.MULTILINE)
    print regexp.findall(test)


Ausgabe: ['6.6', '230', '18', '42', '23']
cyp++
User
Beiträge: 69
Registriert: Freitag 22. September 2006, 13:54

Beitragvon cyp++ » Montag 7. Mai 2007, 14:21

gibt ein nettes Tool.. RegEx Coach.. google das mal und lade es dir runter!
jo_hb
User
Beiträge: 72
Registriert: Donnerstag 26. April 2007, 09:21

Beitragvon jo_hb » Montag 7. Mai 2007, 20:25

Hallo,
Danke für die Tips, Regexcoach ist ja schon echt ne hilfe. :)
Blackjack, das mit dem Euro werd ich mal einbauen, ansonsten ist es aber für meinen Fall gar nicht so schlimm dass die regex nicht soo exakt ist, weil meine textfiles immer sehr genau dasselbe format haben...

Gruss,
Jo

Wer ist online?

Mitglieder in diesem Forum: thorius