2017-10-26 1 views
5

Ich versuche, eine Teilzeichenfolge nach Muster mit gsub() R-Funktion zu extrahieren.Wie extrahiert man einen Teilstring nach inversem Muster mit R?

# Example: extracting "7 years" substring. string <- "Psychologist - 7 years on the website, online" gsub(pattern="[0-9]+\\s+\\w+", replacement="", string)

[1] "Psychologist - on the website, online"

Wie Sie sehen können, ist es einfach benötigte substring gsub(), um auszuschliessen, aber ich brauche das Ergebnis und immer „7 Jahre“ nur invertieren. Ich denke, über die Verwendung von "^", so etwas wie die:

gsub(pattern="[^[0-9]+\\s+\\w+]", replacement="", string)

Bitte, mir jemand mit dem richtigen regexp Mustern helfen könnte?

+0

Jungs, können Sie mir bitte erklären, warum verwenden Sie "\\ 1" in "Ersatz =" \\ 1 ""? – Michael

Antwort

5

können Sie verwenden

sub(pattern=".*?([0-9]+\\s+\\w+).*", replacement="\\1", string) 

this R demo See.

Einzelheiten

  • .*? - alle 0+ Zeichen, so wenig wie möglich
  • ([0-9]+\\s+\\w+) - Capturing Gruppe 1:
    • [0-9]+ - eine oder mehrere Ziffern
    • \\s+-1 oder mehr Leerräume
    • \\w+ - 1 oder mehr Wort Zeichen
  • .* - der Rest der Kette (0+ beliebigen Zeichen, so viele wie möglich)

Die \1 im Ersatz ersetzt durch den Inhalt der Gruppe 1.

+0

Es funktioniert. Was bedeutet "\\ 1" im "Ersatz" -Argument? Sorry für den ersten Kommentar :) – Michael

+1

@Michael * Die '\ 1' im Ersatz ersetzt durch den Inhalt der Gruppe 1 *. '\ 1' ist eine [Ersatzrückreferenz] (https://www.regular-expressions.info/replacebackref.html). –

3

Sie könnten das Gegenteil von dem \d verwenden, die \D in R ist:

string <- "Psychologist - 7 years on the website, online" 
sub(pattern = "\\D*(\\d+\\s+\\w+).*", replacement = "\\1", string) 
# [1] "7 years" 

\D* bedeutet: keine Ziffern so lang wie möglich, der Rest wird in einer Gruppe erfasst und ersetzt dann die komplette Zeichenfolge.

Siehe a demo on regex101.com.

+0

Danke. Gute Lösung. – Michael

Verwandte Themen