Extrahieren von ganzen Wörtern
Habe ich eine große Menge von real-Welt text, den ich ziehen müssen Wörter aus der Eingabe in eine Rechtschreibprüfung. Ich möchte zu extrahieren, wie viele sinnvolle Wörter wie möglich, ohne zu viel Lärm. Ich weiß, es gibt viele regex-ninjas hier in der Nähe, so dass ich hoffe, jemand kann mir helfen.
Derzeit bin ich die Extraktion aller alphabetische Sequenzen mit '[a-z]+'
. Dies ist ein guter Näherungswert, aber es schleppt eine Menge Müll mit.
Ideal möchte ich einige regex (muss nicht schön oder effizient), dass Extrakte alle alphabetischen Sequenzen, getrennt durch Natürliche Trennzeichen (wie [/-_,.: ]
etc.), und ignoriert eine alphabetische Sequenzen mit illegalen Grenzen.
Aber ich würde auch gerne nur in der Lage sein, um alle alphabetischen Sequenzen, die NICHT benachbart SIND, um eine Anzahl. So zum Beispiel 'pie21'
würde NICHT extrahieren 'pie'
, aber 'http://foo.com'
extrahiert ['http', 'foo', 'com']
.
Versuchte ich lookahead
und lookbehind
Behauptungen, aber Sie waren pro-Zeichen (also zum Beispiel re.findall('(?<!\d)[a-z]+(?!\d)', 'pie21')
zurückkehren würde 'pi'
wenn ich will, dass es nichts zurück). Ich habe versucht, das einwickeln der alpha Teil, wie ein Begriff ( (?:[a-z]+)
), aber es hat nicht geholfen.
Detail: Der Daten wird eine E-Mail-Datenbank, so ist es meist einfach Englisch mit normalen zahlen, aber gelegentlich gibt es Müll Zeichenfolgen wie GIHQ4NWL0S5SCGBDD40ZXE5IDP13TYNEA
und AC7A21C0
dass ich gerne komplett ignorieren. Ich gehe davon aus, dass alle alphabetischen Reihenfolge mit einer Zahl, es ist Quatsch.
- Besser verwenden Sie raw-strings mit regexes.
\d
passiert, zu arbeiten, aber auch andere escape-Sequenzen werden scheitern, und das kann schwer sein, zu Debuggen.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn Sie beschränken Sie sich auf ASCII-Buchstaben, dann verwenden Sie (mit der
re.I
option set)\b
ist eine Wort-Grenze Anker, passend nur zu Beginn und am Ende des alphanumerischen "Worte". So\b[a-z]+\b
entsprichtpie
, aber nichtpie21
oder21pie
.Damit auch andere nicht-ASCII-Buchstaben, die Sie verwenden können, so etwas wie dieses:
die es erlaubt, auch Zeichen mit Akzent usw. Stellen Sie die
re.UNICODE
option, vor allem, wenn mit Python 2, damit die\w
Kürzel übereinstimmen, nicht-ASCII-Buchstaben.[^\W\d_]
als eine negierte Zeichenklasse können alle alphanumerischen Zeichen außer Ziffern und dem Unterstrich bestehen.\b
s zu arbeiten. Mittext
legen, wie es einige normale Satzre.findall('\b[a-z]+\b', text, re.I)
gibt nichts zurück. Egal, was ich in die eckigen Klammern (oder mitsearch
odermatch
) es scheint nicht zu helfen. Mit\B
bekommt von mir einige Ergebnisse, aber die Streifen der ersten und letzten Zeichen eines jeden Wortes. Wie faul, wie es klingt, ich bin viel zu müde, um pick-up ein neues Konzept jetzt; eine chance, die Sie wissen, warum es nicht funktioniert? Oder Sie können post eine wörtliche Beispiel, wie Sie möchten, verwenden Sie in diesem Fall?r"\b[a-z]\b"
), die\b
interpretiert werden, als ein backspace-Zeichen.wenn bei Beförderungen Schäden
)re.UNICODE
oderre.LOCALE
option. Ich sollte hinzufügen, dass auf meine Antwort.Sind Sie vertraut mit Wortgrenzen? (
\b
). Sie können extrahieren Sie word mithilfe der\b
um die Reihenfolge und passend zum alphabet, in:Zum Beispiel, diese greifen, werden ganze Wörter aber halt am Token wie Bindestriche, Punkte, Semikolons, etc.
Können Sie die
\b
Sequenz, und andere, über die python-HandbuchBEARBEITEN Auch, wenn Sie schauen, um über eine Zahl nach oder vor dem Spiel, können Sie mit einer negative look-ahead/behind:
\b
klingt wie das, was ich will, aber es ist nicht gerade schön. Irgendwelche Ideen? Ich habe versucht, die lookahead-und lookbehinds vor, aber Sie scheinen zu entsprechen, werden alle Zeichen bis zu dem Zeichen, das grenzt an eine Nummer, und so nicht komplett ignorieren Wörter mit zahlen in Ihnen. Auch er beschwert sich über lookaheads brauchen Feste Breite Muster mit denen +s drin.Was:
Beachten Sie, dass:
BEARBEITEN : Hinzugefügt einige Erklärungen
re.finditer()
? Ich brauche zu verfolgen, die start-und end-Indizes der einzelnen passen in den text.Beispielcode
oder