Reguläre Ausrücke

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
BreathBrightBrother
User
Beiträge: 11
Registriert: Mittwoch 4. Juni 2008, 08:13

Sonntag 11. Januar 2009, 15:21

Hallo,

Ich wollte mit Hilfe von regulären Ausdrücken einen Text taggen, scheitere aber an diesen.
Ich habe eine externe Datei folgenden Inhalts:

Code: Alles auswählen

\b[A-ZÄÖÜ]*[a-zäöüß]+\b wort
\s   ws
\b[0-9]+\b   integer
\b[0-9]*[.|,][0-9]+\b    floatingPointNumber
\b[I|V|X|L|C|M|D]+\b roemischeZahl
Trotz der gesetzten Wortgrenzen \b macht er aus Radium3000 "Unknown" und "integer", statt den ganzen String auf unknown zu setzen.
Was muss ich an den Ausdrücken ändern, damit sie wirklich nur auf Worte zugreifen?

Vielen Dank schon mal
BBB[/code]
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

Sonntag 11. Januar 2009, 16:28

Deine Frage ist komplett unterspezifiziert. Was du da zeigst ist kein Python und wir können nur raten, wie du deine Eingabe zu regulären Ausdrücken verarbeitest.

Dies hier funktioniert jedenfalls wie gedacht: Die 3000 wird nicht gefunden.

Code: Alles auswählen

import re
r = re.compile(r"\b[0-9]+\b")
print r.findall("43 x Radium3000")
Stefan
__marcus__
User
Beiträge: 92
Registriert: Mittwoch 10. September 2008, 22:10
Wohnort: Hamburg

Sonntag 11. Januar 2009, 18:49

Bei RegEx ist immer wichtig, ganz genau zu wissen, was man sucht und was sonst noch an Daten vorhanden sein kann.
BreathBrightBrother
User
Beiträge: 11
Registriert: Mittwoch 4. Juni 2008, 08:13

Montag 12. Januar 2009, 00:18

Wie bekomme ich denn das "r" vor den Regexstring, wenn ich die Ausdrücke aus einer Datei lese?

Ich hab nur die Ausdrücke angegeben, da das Problem ja scheinbar an den nicht beachteten Wortgrenzen liegt.
BlackJack

Montag 12. Januar 2009, 01:42

@BreathBrightBrother: Das 'r' bekommst Du da gar nicht vor die Zeichenkette weil es eben keine Python-Quelltextdatei ist. Das beeinflusst ja auch nur wie Python das Zeichenkettenliteral im Quelltext interpretiert. Die Zeichenkette, die dabei entsteht ist nichts besonderes.

Vielleicht magst Du ja mal ein minimales Beispielprogramm mit dem Problem zeigen, denn sma's Beispiel deutet ja darauf hin, dass es eigentlich nicht am Ausdruck liegen kann. Denn ob man den nun aus der Datei liest, oder im Quelltext angibt, sollte keinen Unterschied machen.
BreathBrightBrother
User
Beiträge: 11
Registriert: Mittwoch 4. Juni 2008, 08:13

Montag 12. Januar 2009, 10:37

So sieht der code aus, der die Regexe ausliest und compiliert.

Code: Alles auswählen

    # KONSTRUKTOR

    def __init__(self, typdefFile, inputFile, bufferSize=100, bufferRefreshValue=.04):

        self.brv = bufferRefreshValue

        self.size = bufferSize

        self.dat = open(inputFile)

        pattern = ""        

        tdf = open(typdefFile)
        # Auslesen der reg. Ausdrücke

        for line in tdf.readlines():

            line = line.rstrip()
            # print "Test: "+line

            self.regListe.append((line.split()[1],line.split()[0].replace('\\\\','\\')))



        # Big disjunction over the regular expressions.

        for (typ,patternT) in self.regListe[:-1]:

            pattern += patternT+"|"
            #print self.regListe
        pattern += self.regListe[-1:][0][1]
        # print pattern
       	# print "Pattern fertig"

        self.token = re.compile(pattern)
BlackJack

Montag 12. Januar 2009, 13:24

Okay, ich hätt's gleich sagen sollen: Ein lauffähiges Minimalbeispiel, welches das Problem demonstriert.

Hier fiele mir als erstes mal auf, dass `self.regListe` einen `AttributeError` auslösen würde, es sei denn das ist als Klassenattribut definiert, was ich zumindes komisch finden würde.

Was soll die `replace()`-Aktion? Hast Du tatsächlich doppelte \ in der Textdatei und sollen die wirklich als ein Einziger interpretiert werden? Warum stehen sie dann nicht gleich so in der Datei?

`pattern` wird umständlich gebildet. Da sollte man besser '|'.join() verwenden.
Antworten