2017-11-03 2 views
1

Ich habe viele Wiederholungen der Extraktion w/gsub gesehen, aber sie befassen sich hauptsächlich mit dem Extrahieren von links nach rechts oder nach einem Auftreten. Ich möchte von rechts nach links passen und vier Vorkommen von zählen, die alles zwischen dem 3. und 4. Vorkommen zusammenpassen.R - Extrahieren von Informationen nach dem n-ten Vorkommen eines Zeichens von der rechten Seite der Zeichenfolge

Zum Beispiel:

string      outcome 
here-are-some-words-to-try some 
a-b-c-d-e-f-g-h-i   f 

Hier sind ein paar Referenzen, die ich versucht habe, mit:

+0

Dirtyest Lösung: umkehren Sie Ihre Eingabezeichenfolge, stimmen Sie überein, und kehren Sie das übereinstimmende Muster um. – Bentoy13

Antwort

1

könnten Sie verwenden

([^-]+)(?:-[^-]+){3}$ 

a demo on regex101.com See.


In R diese

könnte
library(dplyr) 
library(stringr) 
df <- data.frame(string = c('here-are-some-words-to-try', 'a-b-c-d-e-f-g-h-i', ' no dash in here'), stringsAsFactors = FALSE) 

df <- df %>% 
    mutate(outcome = str_match(string, '([^-]+)(?:-[^-]+){3}$')[,2]) 
df 

Und Ausbeuten

     string outcome 
1 here-are-some-words-to-try some 
2   a-b-c-d-e-f-g-h-i  f 
3   no dash in here <NA> 
+0

Dies wäre die ursprüngliche Richtung, die ich versuchte zu gehen, außer es ist rückwärts von dem, was ich brauche. Zum Beispiel würde dies "hier-sind" statt "einige Worte zu versuchen" greifen. Gibt es eine Möglichkeit umzukehren, was gegriffen wird? – alexb523

+0

@ alexb523: Nicht sicher, was Sie meinen, sehen Sie die aktualisierte Antwort, die das Ergebnis produziert, das Sie haben wollten. – Jan

+1

danke, ich habe versucht, w/gsub zu verwenden. Dies funktioniert wie oben beschrieben. – alexb523

2
x = c("here-are-some-words-to-try", "a-b-c-d-e-f-g-h-i") 
sapply(x, function(strings){ 
    ind = unlist(gregexpr(pattern = "-", text = strings)) 
    if (length(ind) < 4){NA} 
    else{substr(strings, ind[length(ind) - 3] + 1, ind[length(ind) - 2] - 1)} 
}) 
#here-are-some-words-to-try   a-b-c-d-e-f-g-h-i 
#     "some"      "f" 
+0

Eingabefehler bei zu wenigen Bindestrichen. Wahrscheinlich sollte ich stattdessen NA geben, aber das könnte dem OP/Benutzer überlassen werden, denke ich. – Frank

0

Wie wäre Ihr Satz Aufspalten? So etwas wie

string <- "here-are-some-words-to-try" 

# separate all words 
val <- strsplit(string, "-")[[1]] 

# reverse the order 
val rev(val) 

# take the 4th element 
val[4] 

# And using a dataframe 
library(tidyverse) 
tibble(string = c("here-are-some-words-to-try", "a-b-c-d-e-f-g-h-i")) %>% 
mutate(outcome = map_chr(string, function(s) rev(strsplit(s, "-")[[1]])[4])) 
Verwandte Themen