Ich habe eine große Menge realen Text, aus dem ich Worte ziehen muss, um sie in eine Rechtschreibprüfung einzugeben. Ich möchte so viele aussagekräftige Wörter wie möglich ohne zu viel Rauschen extrahieren. Ich weiß, dass es hier viele Regex-Ninjas gibt, also hoffentlich kann mir jemand helfen.
Momentan extrahiere ich alle alphabetischen Sequenzen mit '[a-z]+'
. Das ist eine gute Näherung, aber es bringt viel Müll mit sich.
Idealerweise Ich möchte eine Regex (muss nicht hübsch oder effizient sein), die alle alphabetischen Sequenzen extrahiert, die durch natürliche Worttrennzeichen (wie [/-_,.: ]
usw.) begrenzt sind, und ignoriert alle alphabetische Sequenzen mit unzulässigen Schranken.
Ich würde aber auch gerne alle alphabetischen Sequenzen bekommen, die NICHT an eine Nummer angrenzen. So würde beispielsweise 'pie21'
NICHT 'pie'
extrahieren, aber 'http://foo.com'
würde ['http', 'foo', 'com']
extrahieren.
Ich habe lookahead
und lookbehind
Assertions versucht, aber sie wurden pro Zeichen angewendet (also würde zB re.findall('(?<!\d)[a-z]+(?!\d)', 'pie21')
'pi'
zurückgeben, wenn ich möchte, dass nichts zurückgegeben wird). Ich habe versucht, den Alphateil als Ausdruck zu verwenden ( (?:[a-z]+)
), aber es hat nicht geholfen.
Mehr Details: Die Daten sind eine E-Mail-Datenbank, daher ist es meistens normales Englisch mit normalen Zahlen, aber gelegentlich gibt es Abfallzeichenfolgen wie GIHQ4NWL0S5SCGBDD40ZXE5IDP13TYNEA
und AC7A21C0
, die ich komplett ignorieren möchte . Ich nehme an, dass jede alphabetische Sequenz mit einer Zahl darin Unsinn ist.
Wenn Sie sich auf ASCII-Buchstaben beschränken, verwenden Sie (mit der Option re.I
)
\b
ist ein Wortgrenzenanker, der nur am Anfang und am Ende von alphanumerischen "Wörtern" übereinstimmt. Also stimmt \b[a-z]+\b
mit pie
überein, aber nicht mit pie21
oder 21pie
.
Um auch andere Nicht-ASCII-Buchstaben zuzulassen, können Sie etwas wie folgt verwenden:
%Vor%, die auch Zeichen mit Akzent usw. erlaubt. Möglicherweise müssen Sie die Option re.UNICODE
festlegen, insbesondere wenn Sie Python 2 verwenden, damit die Kurzschrift \w
mit Nicht-ASCII-Buchstaben übereinstimmen kann.
[^\W\d_]
als negierte Zeichenklasse erlaubt jedes alphanumerische Zeichen außer Ziffern und Unterstrichen.
Kennen Sie Wortgrenzen? ( \b
). Sie können Wörter mit dem \b
um die Sequenz herum extrahieren und das Alphabet innerhalb von:
Zum Beispiel wird dies ganze Wörter aufnehmen, aber an Token wie Bindestrichen, Punkten, Semikolons, etc. aufhören.
Sie können die \b
-Sequenz und andere im Python-Handbuch
BEARBEITEN Wenn Sie nach einer Zahl suchen, die der Übereinstimmung folgt oder ihr vorausgeht, können Sie auch eine negative Vorausschau verwenden:
%Vor%Was ist mit:
%Vor%Beachten Sie Folgendes:
BEARBEITEN : einige Erklärungen hinzugefügt
Tags und Links python regex alphabetical word text-extraction