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"
我正在尝试从字符串中提取第 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"