string = "ABC3JFD456"
假设我有上面的字符串,我希望找到字符串中的第一个数字并存储其值。在这种情况下,我想存储值3(因为它是字符串中的第一个出现的数字)。 grepl("\\d", string)
仅返回逻辑值,但不告诉我有关第一个数字的位置或内容的任何信息。我应该使用哪个正则表达式来查找第一个数字的值?
答案 0 :(得分:11)
基础R
regmatches(string, regexpr("\\d", string))
## [1] "3"
或使用stringi
library(stringi)
stri_extract_first(string, regex = "\\d")
## [1] "3"
或使用stringr
library(stringr)
str_extract(string, "\\d")
## [1] "3"
答案 1 :(得分:6)
1)sub 使用指示的正则表达式尝试sub
,该正则表达式采用最短的字符串,直到数字,数字,然后是所有后续内容并用数字替换它:
sub(".*?(\\d).*", "\\1", string)
,并提供:
[1] "3"
如果string
是字符串向量,这也有效。
2)strapplyc 还可以使用gsubfn中的strapplyc
,在这种情况下可以使用更简单的正则表达式:
strapplyc(string, "\\d", simplify = TRUE)[1]
给出相同的或使用它再次给出相同的答案,但如果string
是字符串向量,也可以起作用:
sapply(strapplyc(string, "\\d"), "[[", 1)
答案 2 :(得分:3)
获取数字的位置
tmp <- gregexpr("[0-9]", string)
iloc <- unlist(tmp)[1]
提取第一个数字
as.numeric(substr(string,iloc,iloc))
使用regexpr更简单
tmp<-regexpr("[0-9]",string)
if(tmp[[1]]>=0) {
iloc <- tmp[1]
num <- as.numeric(substr(string,iloc,iloc))
}
答案 3 :(得分:1)
使用rex可能会使这类任务变得更简单。
string = c("ABC3JFD456", "ARST4DS324")
re_matches(string,
rex(
capture(name = "first_number", digit)
)
)
#> first_number
#> 1 3
#> 2 4
答案 4 :(得分:0)
> which( sapply( strsplit(string, ""), grepl, patt="[[:digit:]]"))[1]
[1] 4
或
> gregexpr("[[:digit:]]", string)[[1]][1]
[1] 4
所以:
> splstr[[1]][ which( sapply( splstr, grepl, patt="[[:digit:]]"))[1] ]
[1] "3"
请注意,gregexpr调用的完整结果是一个列表,因此需要使用“[[”:
提取其第一个元素> gregexpr("[[:digit:]]", string)
[[1]]
[1] 4 8 9 10
attr(,"match.length")
[1] 1 1 1 1
attr(,"useBytes")
[1] TRUE
答案 5 :(得分:0)
gsub
解决方案基于使用空字符串替换第一个数字前后的子字符串:
gsub("^\\D*(?=\\d)|(?<=\\d).*", "", string, perl = TRUE)
# [1] "3"