r-从后面开始提取最后一组数字的较短方法



我想从字符串中提取最后一组数字,而不需要这样做。

"sdkjfn45sdjk54()ad"
str_remove("sdkjfn45sdjk54()ad","[:alpha:]+$")
[1] "sdkjfn45sdjk54()"
str_remove(str_remove("sdkjfn45sdjk54()ad","[:alpha:]+$"), "\(")
[1] "sdkjfn45sdjk54)"
str_remove(str_remove(str_remove("sdkjfn45sdjk54()ad","[:alpha:]+$"), "\("), "\)")
[1] "sdkjfn45sdjk54"
str_extract(str_remove(str_remove(str_remove("sdkjfn45sdjk54()ad","[:alpha:]+$"), "\("), "\)"), "\d+$")
[1] "54"

因为模式是不确定的。我知道stringi有一个str_extract_from_last函数,但我需要坚持使用基R或stringR。

谢谢!

您可以使用负前瞻正则表达式。

string <- "sdkjfn45sdjk54()ad"
stringr::str_extract(string, '(\d+)(?!.*\d)')
#[1] "54"

在基R:中使用相同的正则表达式

regmatches(string, gregexpr('(\d+)(?!.*\d)', string, perl = TRUE))[[1]]

这会提取后面没有任何数字的数字集,因此是最后一组数字。

使用str_extract_all,只获取每个向量中的最后一个。

library(stringr)
quux <- str_extract_all(c("a", "sdkjfn45sdjk54()ad"), "[0-9]+")
sapply(quux, `[`, lengths(quux))
# [1] NA   "54"

我使用sapply是因为我猜您有多个字符串。str_extract_all将返回一个list,其中每个元素是从源中提取的零个或多个字符串。由于我们只对其中一个感兴趣,我们可以使用sapply

人们可能会想使用sapply(., tail, 1),但如果找到零,那么它将是character(0),而不是空的或NA。我推断,当没有找到模式时,NA将是一个很好的回报。