R:找到字符串中的最后一个点

Hon*_*Ooi 45 regex r

在R中,是否有比下面找到字符串中最后一个点的位置更好/更简单的方法?

x <- "hello.world.123.456"
g <- gregexpr(".", x, fixed=TRUE)
loc <- g[[1]]
loc[length(loc)]  # returns 16
Run Code Online (Sandbox Code Playgroud)

这会找到字符串中的所有点,然后返回最后一个点,但它看起来相当笨拙.我尝试使用正则表达式,但没有走得太远.

Vin*_*ent 69

这对你有用吗?

x <- "hello.world.123.456"
g <- regexpr("\\.[^\\.]*$", x)
g
Run Code Online (Sandbox Code Playgroud)
  • \. 匹配一个点
  • [^\.] 匹配除了点之外的一切
  • * 指定前一个表达式(除了点之外的所有内容)可以在0和无限次之间发生
  • $ 标记字符串的结尾.

把所有东西放在一起:找到一个点,后跟除了点之外的任何东西,直到字符串结束.R需要\被转义,因此\\在上面的表达中.请参阅regex101.com以试用正则表达式.


mds*_*ner 29

一个小的语法改进怎么样?

这适用于输入向量长度为​​1的文字示例.使用escapes获取文字"." 搜索并反转结果以将最后一个索引作为"第一个":

 rev(gregexpr("\\.", x)[[1]])[1]
Run Code Online (Sandbox Code Playgroud)

一个更合适的矢量化版本(如果x长于1):

 sapply(gregexpr("\\.", x), function(x) rev(x)[1])
Run Code Online (Sandbox Code Playgroud)

而另一个使用尾巴的更整洁的选择:

sapply(gregexpr("\\.", x), tail, 1)
Run Code Online (Sandbox Code Playgroud)


Hon*_*Ooi 6

有人发布了我真正喜欢的以下答案,但我注意到他们删除了它:

regexpr("\\.[^\\.]*$", x)
Run Code Online (Sandbox Code Playgroud)

我喜欢它,因为它直接产生所需的位置,而不必搜索结果.正则表达式也相当干净,这是一个例外的正则表达式:)