我想从字符串中提取最后一组数字,而不需要这样做。
"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
将是一个很好的回报。