Группа без захвата в R Regex

Я пытаюсь извлечь n слово из строк и нашел несколько -specific-word">ссылки, предлагающие метод, который не работает в R.

myString <- "HANS CHRISTIAN ANDERSON III"

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

Как видите, мои команды возвращают как группу без захвата, так и группу захвата. Каково решение, чтобы получить только конкретное nth слово?


person jks612    schedule 21.04.2016    source источник


Ответы (3)


Regex прав. Это потому, что вы не получили значение группы 1, а вместо этого переворачиваете всю перехваченную строку с помощью Regex.

library(stringr)

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

str_match_all(s, r)
#[[1]]
#           [,1]           [,2]  
#[1,] "HANS CHRISTIAN" "CHRISTIAN"
person Aminah Nuraini    schedule 21.04.2016
comment
Есть ли способ сопоставить использование регулярного выражения, а не использование str_match(myString,"(?:\\S+ ){1}(\\S+)")[2]? - person jks612; 21.04.2016
comment
В этом ответе я использую str_match_all. Я думаю, что вы не можете получить значение группы, используя str_match - person Aminah Nuraini; 21.04.2016

Отрицание классов символов формируется, когда первым символом является «^», поэтому в первом классе захвата будут найдены все символы, не являющиеся пробелами, и первый пробел.

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

Другая стратегия, возможно, менее подверженная сбоям:

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

Я неравнодушен к strsplit:

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

paste(strsplit(myString, ' ')[[1]][1:2], collapse = ' ')
# [1] "HANS CHRISTIAN"
person alistaire    schedule 21.04.2016
comment
Действительно, регулярное выражение может оказаться излишним для этой задачи, если строки не сложные. В векторизованной форме у вас будет: sapply(strsplit(myString,"\\s+"), `[`, 2) или vapply(strsplit(myString,"\\s+"), `[`, 2, FUN.VALUE=character(1)), если скорость имеет значение. - person thelatemail; 21.04.2016