2016-04-21 12 views
1

Ich versuche, das n te Wort von Strings zu extrahieren und fand mehrere links, das ein Verfahren vorzuschlagen, die nicht in R. scheintNichterfassungsgruppe in R Regex

myString <- "HANS CHRISTIAN ANDERSON III" 

str_extract(myString,'(?:\\S+){1}(\\S+)') 
# [1] "HANS CHRISTIAN" 
str_extract(myString,'(?:\\S+){2}(\\S+)') 
# [1] "HANS CHRISTIAN ANDERSON" 

zu arbeiten Wie können Sie Sehen Sie, meine Befehle geben sowohl die nicht erfassende als auch die einfangende Gruppe zurück. Was ist die Lösung, um nur das spezifische n Wort zu bekommen?

Antwort

4

Der Regex hat Recht. Das liegt daran, dass Sie nicht den Wert für Gruppe 1 erhalten haben, sondern stattdessen die gesamte abgefangene Zeichenfolge von Regex.

library(stringr) 

r <- "(?:\\S+){1}(\\S+)" 
s <- "HANS CHRISTIAN ANDERSON III" 

str_match_all(s, r) 
#[[1]] 
#   [,1]   [,2] 
#[1,] "HANS CHRISTIAN" "CHRISTIAN" 
+0

Gibt es eine Möglichkeit, um mit 'str_match im Gegensatz mit Regex übereinstimmen (myString, "(?: \\ S +) {1} (\\ S +)") [2] '? – jks612

+0

In dieser Antwort verwende ich 'str_match_all'. Ich denke, dass Sie einen Gruppenwert nicht mit 'str_match' erhalten können. –

2

Die Negation von Zeichenklassen gebildet wird, wenn das erste Zeichen „^“, so findet diese alle nicht-Leerzeichen und den ersten Platz in der ersten Capture-Klasse.

# second space delimited name 
gsub('^([^ ]+[ ])([^ ]+)([ ]+.+$)', "\\2", myString) 
[1] "CHRISTIAN" 

Eine andere Strategie, wohl weniger fehleranfällig:

# easy to use a numberic value to pick from a scan-read: 
scan(text=myString, what="")[2] 
Read 4 items 
[1] "CHRISTIAN" 
2

Ich bin teilweise zu strsplit:

strsplit(myString, ' ')[[1]][2] 
# [1] "CHRISTIAN" 

paste(strsplit(myString, ' ')[[1]][1:2], collapse = ' ') 
# [1] "HANS CHRISTIAN" 
+1

In der Tat kann Regex für diese Aufgabe übertrieben sein, wenn die Zeichenfolgen nicht komplex sind. In der vektorisierten Form hättest du: 'sapply (strsplit (myString," \\ s + "), \' [\ ', 2)' oder 'vapply (strsplit (myString," \\ s + "), \' [\ ', 2, FUN.VALUE = Zeichen (1))' wenn die Geschwindigkeit zählt. – thelatemail