首页 > 解决方案 > 从后面开始提取最后一组数字的更短方法

问题描述

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

"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 函数,但我需要坚持使用 base R 或 stringR。

谢谢!

标签: rstringr

解决方案


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

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

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

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

这将提取后面没有任何数字的一组数字,所以最后一组数字。


推荐阅读