如果我们想提取大括号之间有- 的数字,一个选项是str_extract。如果字符串中有多个模式,请使用str_extract_all
library(stringr)
str_extract(str1, '(?<=\\()[0-9-]+(?=\\))')
#[1] "123-456-789"
str_extract_all(str2, '(?<=\\()[0-9-]+(?=\\))')
在上面的代码中,我们使用正则表达式查找来提取数字和-。 (?<=\\()[0-9-]+ 的正向后视与(123-456-789 中的数字以及- ([0-9-]+) 匹配,而不是123-456-789。类似地,前瞻 ('[0-9-]+(?=\)') 匹配数字以及 123-456-789) 中的 - 而不是 123-456-798。总而言之,它匹配同时满足条件(123-456-789) 的所有案例,并在环顾之间提取那些案例,而不是 (123-456-789 或 123-456-789) 之类的案例
使用strsplit,您可以将split 指定为[()]。我们将方括号内的() 保留为[] 以将其视为字符,否则我们必须转义括号('\\(|\\)')。
strsplit(str1, '[()]')[[1]][2]
#[1] "123-456-789"
如果要从一个字符串中提取多个子字符串,我们可以使用lapply 循环并使用grep 提取数字拆分部分
lapply(strsplit(str2, '[()]'), function(x) grep('\\d', x, value=TRUE))
或者我们可以使用stringi 中的stri_split,它还可以选择删除空字符串 (omit_empty=TRUE)。
library(stringi)
stri_split_regex(str1, '[()A-Z ]', omit_empty=TRUE)[[1]]
#[1] "123-456-789"
stri_split_regex(str2, '[()A-Z ]', omit_empty=TRUE)
如果我们有兴趣提取括号内的内容,另一个选项是rm_round from qdapRegex。
library(qdapRegex)
rm_round(str1, extract=TRUE)[[1]]
#[1] "123-456-789"
rm_round(str2, extract=TRUE)
数据
str1 <- "A B C (123-456-789)"
str2 <- c("A B C (123-425-478) A", "ABC(123-423-428)",
"(123-423-498) ABCDD",
"(123-432-423)", "ABC (123-423-389) GR (124-233-848) AK")