假设我有一个像" ABC(123-456-789)"这样的字符串,我想知道什么是最好的检索方式" 123-456- 789"从中。
strsplit("A B C (123-456-789)", "\\(")
[[1]]
[1] "A B C" "123-456-789)"
答案 0 :(得分:9)
如果我们想要在大括号之间提取-
的数字,则一个选项为str_extract
。如果字符串中有多个模式,请使用str_extract_all
library(stringr)
str_extract(str1, '(?<=\\()[0-9-]+(?=\\))')
#[1] "123-456-789"
str_extract_all(str2, '(?<=\\()[0-9-]+(?=\\))')
在上面的代码中,我们使用正则表达式的外观来提取数字和-
。积极的外观(?<=\\()[0-9-]+
与-
中的[0-9-]+
((123-456-789
)以及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))
stri_split
或者我们可以使用stringi
中的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
)。
qdapRegex
如果我们有兴趣提取括号内的内容,则另一个选项是来自 library(qdapRegex)
rm_round(str1, extract=TRUE)[[1]]
#[1] "123-456-789"
rm_round(str2, extract=TRUE)
的{{1}}。
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")
int i1 = 5;
int i2 = 0;
int result = i1 * 10 + i2; /* 50 */
答案 1 :(得分:8)
或来自sub
的{{1}}:
base R
说明:
sub("[^(]+\\(([^)]+)\\).*", "\\1", "A B C (123-456-789)")
#[1] "123-456-789"
:匹配除开始支架以外的任何内容
[^(]+
:匹配一个开头括号,就在你想要的之前
\\(
:匹配您要捕获的模式(然后在([^)]+)
中检索),这是除了关闭支架之外的任何内容
replacement="\\1"
匹配一个结束括号后跟任何内容,0次或更多次
另一种具有前瞻和后瞻的选项
\\).*
答案 2 :(得分:5)
sub
中的捕获组将定位您想要的输出:
sub('.*\\((.*)\\).*', '\\1', str1)
[1] "123-456-789"
额外检查以确保我通过@ akrun的扩展示例:
sub('.*\\((.*)\\).*', '\\1', str2)
[1] "123-425-478" "123-423-428" "123-423-498" "123-432-423" "124-233-848"
答案 3 :(得分:4)
也可以尝试:
k<-"A B C (123-456-789)"
regmatches(k,gregexpr("*.(\\d+).*",k))[[1]]
[1] "(123-456-789)"
来自@Arun的建议:
regmatches(k, gregexpr('(?<=\\()[^A-Z ]+(?=\\))', k, perl=TRUE))[[1]]
来自@akrun的建议:
regmatches(k, gregexpr('[0-9-]+', k))[[1]]
答案 4 :(得分:4)
您可以尝试这些gsub功能。
> gsub("[^\\d-]", "", x, perl=T)
[1] "123-456-789"
> gsub(".*\\(|\\)", "", x)
[1] "123-456-789"
> gsub("[^0-9-]", "", x)
[1] "123-456-789"
少数......
> gsub("[0-9-](*SKIP)(*F)|.", "", x, perl=T)
[1] "123-456-789"
> gsub("(?:(?![0-9-]).)*", "", x, perl=T)
[1] "123-456-789"