从后面开始提取最后一组数字的较短方法
A shorter way to extract last set of digits starting from the back
我想在不执行此操作的情况下从字符串中提取最后一组数字。
"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.
谢谢!
使用 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
将 return 一个 list
,其中每个元素都是从源中提取的零个或多个字符串。由于我们只对其中之一感兴趣,因此我们可以使用 sapply
.
人们可能会想使用 sapply(., tail, 1)
,但如果找到零,则它将是 character(0)
,而不是空的或 NA
。我推断当找不到模式时 NA
会是一个很好的 return。
您可以使用否定先行正则表达式。
string <- "sdkjfn45sdjk54()ad"
stringr::str_extract(string, '(\d+)(?!.*\d)')
#[1] "54"
在 base R 中使用相同的正则表达式:
regmatches(string, gregexpr('(\d+)(?!.*\d)', string, perl = TRUE))[[1]]
这将提取后面没有任何数字的数字集,即最后一组数字。
我想在不执行此操作的情况下从字符串中提取最后一组数字。
"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.
谢谢!
使用 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
将 return 一个 list
,其中每个元素都是从源中提取的零个或多个字符串。由于我们只对其中之一感兴趣,因此我们可以使用 sapply
.
人们可能会想使用 sapply(., tail, 1)
,但如果找到零,则它将是 character(0)
,而不是空的或 NA
。我推断当找不到模式时 NA
会是一个很好的 return。
您可以使用否定先行正则表达式。
string <- "sdkjfn45sdjk54()ad"
stringr::str_extract(string, '(\d+)(?!.*\d)')
#[1] "54"
在 base R 中使用相同的正则表达式:
regmatches(string, gregexpr('(\d+)(?!.*\d)', string, perl = TRUE))[[1]]
这将提取后面没有任何数字的数字集,即最后一组数字。