在R中,是否有比下面找到字符串中最后一个点的位置更好/更简单的方法?
x <- "hello.world.123.456"
g <- gregexpr(".", x, fixed=TRUE)
loc <- g[[1]]
loc[length(loc)] # returns 16
这会找到字符串中的所有点,然后返回最后一个点,但它看起来很笨拙。我尝试使用正则表达式,但没有走得太远。
答案 0 :(得分:61)
这对你有用吗?
x <- "hello.world.123.456"
g <- regexpr("\\.[^\\.]*$", x)
g
\.
匹配点[^\.]
匹配除点*
指定前一个表达式(除了点之外的所有内容)可能出现在0到无限次之间$
标记字符串的结尾。 把所有东西放在一起:找到一个点,后跟除了点之外的任何东西,直到字符串结束。 R要求转义\
,因此在上面的表达式中\\
。请参阅regex101.com以试用正则表达式。
答案 1 :(得分:28)
小语法改进怎么样?
这适用于输入向量长度为1的文字示例。使用escapes获取文字“。”搜索并反转结果以将最后一个索引作为“第一个”:
rev(gregexpr("\\.", x)[[1]])[1]
更合适的矢量化版本(如果x
长于1):
sapply(gregexpr("\\.", x), function(x) rev(x)[1])
另一个使用tail的更整洁的选项:
sapply(gregexpr("\\.", x), tail, 1)
答案 2 :(得分:6)
有人发布了我真正喜欢的以下答案,但我注意到他们删除了它:
regexpr("\\.[^\\.]*$", x)
我喜欢它,因为它可以直接生成所需的位置,而无需搜索结果。正则表达式也相当干净,这与regexp有关是一个例外:)
答案 3 :(得分:1)
stringi
软件包中有一个漂亮的stri_locate_last
函数,可以接受文字字符串和正则表达式。
只需找到一个点,就不需要正则表达式了,它就像
stringi::stri_locate_last_fixed(x, ".")[,1]
如果您需要将此函数与正则表达式一起使用,以查找字符串中最后一个正则表达式匹配项的位置,则应将_fixed
替换为_regex
:
stringi::stri_locate_last_regex(x, "\\.")[,1]
注意 .
是一个特殊的正则表达式元字符,在正则表达式中用于匹配文字点字符时应转义。
x <- "hello.world.123.456"
stringi::stri_locate_last_fixed(x, ".")[,1]
stringi::stri_locate_last_regex(x, "\\.")[,1]