Ist es in R möglich, die Gruppenerfassung aus einer Übereinstimmung mit regulären Ausdrücken zu extrahieren? Soweit ich sagen kann, nichts von grep
, grepl
, regexpr
, gregexpr
, sub
, oder gsub
die Gruppe Captures zurück.
Ich muss Schlüssel-Wert-Paare aus Zeichenfolgen extrahieren, die folgendermaßen codiert sind:
\((.*?) :: (0\.[0-9]+)\)
Ich kann immer nur mehrere Greps mit vollständiger Übereinstimmung oder eine externe (Nicht-R-) Verarbeitung durchführen, aber ich hatte gehofft, dass ich alles innerhalb von R ausführen kann. Gibt es eine Funktion oder ein Paket, das eine solche Funktion bietet, um dies zu tun?
quelle
str_match_all()
alle Gruppen in einem[,1]
ist die vollständige Übereinstimmung.[,2:3]
ist die erfassten Gruppen.gsub macht dies anhand Ihres Beispiels:
Sie müssen die \ s in den Anführungszeichen doppelt maskieren, damit sie für den regulären Ausdruck funktionieren.
Hoffe das hilft.
quelle
gsub
Manpage benötigt dringend ein Beispiel, das zeigt, dass Sie '\\ 1' benötigen, um einer Capture-Gruppenreferenz zu entkommen.Versuchen Sie
regmatches()
undregexec()
:quelle
regmatches
den ich noch nie gesehen haberegexec
gibt eine Liste zurück, die nur Informationen zum Speicherort der Übereinstimmungen enthält. Daherregmatches
muss der Benutzer die Zeichenfolge angeben , zu der die Übereinstimmungsliste gehört.gsub () kann dies tun und nur die Erfassungsgruppe zurückgeben:
Damit dies funktioniert, müssen Sie jedoch explizit Elemente außerhalb Ihrer Erfassungsgruppe auswählen, wie in der Hilfe zu gsub () angegeben.
Wenn Ihr zu wählender Text also in der Mitte einer Zeichenfolge liegt, sollten Sie durch Hinzufügen von. * Vor und nach der Erfassungsgruppe nur den Text zurückgeben können.
gsub(".*\\((.*?) :: (0\\.[0-9]+)\\).*","\\1 \\2", "(sometext :: 0.1231313213)") [1] "sometext 0.1231313213"
quelle
Ich mag Perl-kompatible reguläre Ausdrücke. Wahrscheinlich macht es auch jemand anderes ...
Hier ist eine Funktion, die Perl-kompatible reguläre Ausdrücke ausführt und mit der Funktionalität von Funktionen in anderen Sprachen übereinstimmt, an die ich gewöhnt bin:
quelle
So habe ich dieses Problem umgangen. Ich habe zwei separate reguläre Ausdrücke verwendet, um die erste und die zweite Erfassungsgruppe abzugleichen, zwei
gregexpr
Aufrufe auszuführen und dann die übereinstimmenden Teilzeichenfolgen herauszuziehen:quelle
expr "xyx0.0023xyxy" : '[^0-9]*\([.0-9]\+\)'
Lösung mit
strcapture
aus demutils
:quelle
Wie im
stringr
Paket vorgeschlagen, kann dies entweder mitstr_match()
oder erreicht werdenstr_extract()
.Angepasst aus dem Handbuch:
Extrahieren und Kombinieren unserer Gruppen:
Anzeigen von Gruppen mit einer Ausgabematrix (wir interessieren uns für Spalten 2+):
quelle
_all
Suffix für die relevantenstringr
Funktionen.Dies kann mit dem Paket unglue erfolgen , wobei das Beispiel aus der ausgewählten Antwort entnommen wird:
Oder ausgehend von einem Datenrahmen
Sie können den rohen regulären Ausdruck aus dem nicht klebenden Muster erhalten, optional mit der benannten Erfassung:
Weitere Informationen: https://github.com/moodymudskipper/unglue/blob/master/README.md
quelle