R 正则表达式中的非捕获组

Non-capturing Group in R Regex

我正在尝试从字符串中提取第 n 个单词,并发现了几个 links 建议的方法似乎在 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"

如您所见,我的命令返回了非捕获组和捕获组。仅获取特定第 n 个单词的解决方案是什么?

正则表达式是正确的。是因为你没有得到第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"

字符classes的否定是在第一个字符为“^”时形成的,所以这会在第一次捕获中找到所有非space字符和第一个space class.

# 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"

我偏爱strsplit:

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

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