【发布时间】:2011-07-10 00:54:21
【问题描述】:
在 R 中,是否有比以下查找字符串中最后一个点的位置更好/更简单的方法?
x <- "hello.world.123.456"
g <- gregexpr(".", x, fixed=TRUE)
loc <- g[[1]]
loc[length(loc)] # returns 16
这会找到字符串中的所有点,然后返回最后一个,但看起来相当笨拙。我尝试使用正则表达式,但没有走得太远。
【问题讨论】:
在 R 中,是否有比以下查找字符串中最后一个点的位置更好/更简单的方法?
x <- "hello.world.123.456"
g <- gregexpr(".", x, fixed=TRUE)
loc <- g[[1]]
loc[length(loc)] # returns 16
这会找到字符串中的所有点,然后返回最后一个,但看起来相当笨拙。我尝试使用正则表达式,但没有走得太远。
【问题讨论】:
这对你有用吗?
x <- "hello.world.123.456"
g <- regexpr("\\.[^\\.]*$", x)
g
\. 匹配一个点[^\.] 匹配除点以外的所有内容* 指定前面的表达式(除了点之外的所有内容)可能出现在 0 到无限次之间$ 标记字符串的结尾。 把所有东西放在一起:找到一个点,后面跟着一个点,直到字符串结束。 R 要求 \ 被转义,因此在上面的表达式中 \\。请参阅regex101.com 以试验正则表达式。
【讨论】:
稍微改进一下语法怎么样?
这适用于输入向量长度为 1 的文字示例。使用转义符获取文字“。”搜索,并反转结果以获取最后一个索引作为“第一个”:
rev(gregexpr("\\.", x)[[1]])[1]
更合适的矢量化版本(如果x 长于1):
sapply(gregexpr("\\.", x), function(x) rev(x)[1])
还有另一个更简洁的选项来使用tail:
sapply(gregexpr("\\.", x), tail, 1)
【讨论】:
有人发布了以下我非常喜欢的答案,但我注意到他们已将其删除:
regexpr("\\.[^\\.]*$", x)
我喜欢它,因为它直接生成所需的位置,而无需搜索结果。正则表达式也相当干净,这在正则表达式方面有点例外:)
【讨论】:
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]
【讨论】: