R:如何找到字符串中的第一个数字

时间:2014-12-01 22:12:44

标签: regex r

    string = "ABC3JFD456"

假设我有上面的字符串,我希望找到字符串中的第一个数字并存储其值。在这种情况下,我想存储值3(因为它是字符串中的第一个出现的数字)。 grepl("\\d", string)仅返回逻辑值,但不告诉我有关第一个数字的位置或内容的任何信息。我应该使用哪个正则表达式来查找第一个数字的值?

6 个答案:

答案 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"