2017-10-31 1 views
0

Ich versuche herauszufinden, wie oft eine Variante eines deutschen Jobnamens in einer gegebenen Zeichenfolge erscheint. Angenommen, der Jobname lautet Schneider (Tailor). Die Varianten (bezeichnet männliche und weibliche Formen des Auftragsname), einschließlich der Jobnamen selbst sind:Regexes: Anzahl der genauen Übereinstimmungen zählen

Schneider 
Schneiderin 
Schneider/in 
Schneider/-in 
Schneider (m/w) 

Also nehme ich die folgende Zeichenfolge:

Schneider Schneiderin Schneider/in Schneider/-in Schneider (m/w) 

Jede Variante einzeln gezählt werden soll, abgesehen von jede Überlappung zwischen den Varianten. Wenn ich also jede Variante durchführe und die Anzahl der Vorkommen in der obigen Zeichenkette zähle, sollte das Ergebnis immer 1 sein.

Ich habe versucht, dies mit einer Regex mit Wortgrenzen zu lösen. Ich habe das folgende Muster verwendet:

\b{}\b(?![\/]|(\s\(m\/w\))) 

wo {} wird durch die Variante ersetzt.

Wie Sie sehen können, verwendet die Regex Wortgrenzen, um sicherzustellen, dass nur vollständige Wortübereinstimmungen gefunden werden. Darüber hinaus verwendet es Forward-Lookahead, um Schrägstriche auszuschließen, und (m/w) nicht als Wortgrenzen behandelt werden.

Das Muster funktioniert gut bis auf das letzte Muster (Schneider (m/w)), das nicht in der Zeichenfolge gefunden wird. Sie können dies hier in Aktion sehen: https://regex101.com/r/FTqvIO/4

Aus Gründen der Vollständigkeit in Python meine aktuelle Implementierung ist hier:

import re 
def count_variant(variant, string): 
    pattern = re.compile(r'\b%s\b(?![\/]|(\s\(m\/w\)))' % variant) 
    matches = re.findall(pattern, string) 
    return len(matches) 

Jede Hilfe zu dem regulären Ausdruck (oder ein einfacher Ansatz, wenn vorhanden) ist sehr zu schätzen!

bearbeiten: Eingefügt den richtigen Link zu Regex101

Antwort

1

Sie eindeutige Wortgrenzen verwenden:

r'(?<!\w){}(?![\w/]|\s\(m/w\))'.format(re.escape(word)) 

die

Siehe regex demo

Die (?<!\w) wird das Spiel nicht, wenn es ein Wort char vor dem Suchbegriff und (?!\w) wird die Übereinstimmung fehlschlagen, wenn ein Wort char nach dem Suchwort ist.

+0

Alter, du rockst! – tiefenauer

Verwandte Themen