2017-06-24 3 views
0

Ich habe einen regulären Ausdruck erstellt, um Tokens in einem deutschen text, der vom Typ string ist.Python 2.7 Regex Tokenizer Implementation funktioniert nicht

Mein regulärer Ausdruck funktioniert wie erwartet mit regex101.com. Hier ist ein Link von meiner regex mit einem Beispielsatz: My regex + example on regex101.com

So implementiert ich es in python 2.7 wie folgt aus:

GERMAN_TOKENIZER = r'''(?x) # set flag to allow verbose regex 
([A-ZÄÖÜ]\.)+ # abbrevations including ÄÖÜ 
|\d+([.,]\d+)?([€$%])? # numbers, allowing commas as seperators and € as currency 
|[\wäöü]+ # matches normal words 
|\.\.\. # ellipsis 
|[][.,;\"'?():-_'!] # matches special characters including ! 
''' 

def tokenize_german_text(text): 
    ''' 
     Takes a text of type string and 
     tokenizes the text 
    ''' 
    matchObject = re.findall(GERMAN_TOKENIZER, text) 
    pass 

tokenize_german_text(u'Das ist ein Deutscher Text! Er enthält auch Währungen, 10€') 

Ergebnis:

result Als ich das Debuggen dieses fand ich heraus, dass Die matchObject ist nur eine Liste mit 11 Einträgen mit leeren Zeichen. Warum funktioniert es nicht wie erwartet und wie kann ich das beheben?

+1

Zusatz Hinweis: Sie könnten Ihre Regex mit der Option 're.UNICODE' kompilieren, damit' \ w' Nicht-ASCII-Buchstaben zuordnen kann - schließlich gibt es deutsche Wörter, die andere Akzente als Umlaute enthalten Vermisse diese jetzt. –

Antwort

1

re.findall() sammelt nur die Übereinstimmungen in Erfassungsgruppen (es sei denn, es gibt keine Erfassungsgruppen in Ihrer Regex, in diesem Fall erfasst es jede Übereinstimmung).

Ihr Regex stimmt also mehrmals überein, aber jedes Mal, wenn ein Match stattfindet, an dem keine einfangende Gruppe beteiligt ist. Entfernen Sie die einfangenden Gruppen und Sie werden Ergebnisse sehen. Außerdem legen Sie die - am Ende der Zeichenklasse, wenn Sie tatsächlich den Bereich der Zeichen zwischen : übereinstimmen soll und _ (aber nicht die - selbst):

GERMAN_TOKENIZER = r'''(?x) # set flag to allow verbose regex 
(?:[A-ZÄÖÜ]\.)+ # abbrevations including ÄÖÜ 
|\d+(?:[.,]\d+)?[€$%]? # numbers, allowing commas as seperators and € as currency 
|[\wäöü]+ # matches normal words 
|\.\.\. # ellipsis 
|[][.,;\"'?():_'!-] # matches special characters including ! 
''' 

Ergebnis:

['Das', 'ist', 'ein', 'Deutscher', 'Text', '!', 'Er', 'enthält', 'auch', 'Währungen', ',', '10€'] 
Verwandte Themen