删除最后一次出现的字符

时间:2013-01-25 20:01:20

标签: regex r

海报希望使用正则表达式(不是strsplit)删除字符串的最后一段时间的question came across talkstats.com today。我试图这样做,但没有成功。

N <- c("59.22.07", "58.01.32", "57.26.49")

#my attempts:
gsub("(!?\\.)", "", N)
gsub("([\\.]?!)", "", N)

我们怎样才能删除字符串中的最后一个句点:

[1] "59.2207" "58.0132" "57.2649"

4 个答案:

答案 0 :(得分:23)

也许这看起来好一点:

gsub("(.*)\\.(.*)", "\\1\\2", N)
[1] "59.2207" "58.0132" "57.2649"

因为它是贪婪的,所以第一个(.*)将匹配最后一个.的所有内容,并将其存储在\\1中。第二个(.*)将匹配上一个.之后的所有内容,并将其存储在\\2中。

这是一个通用的答案,你可以用你选择的任何字符替换\\.来删除该字符的最后一次出现。这只是一个替代品!

你甚至可以这样做:

gsub("(.*)\\.", "\\1", N)

答案 1 :(得分:12)

你需要这个正则表达式: -

[.](?=[^.]*$)

并用空字符串替换它。

所以,应该是这样的: -

gsub("[.](?=[^.]*$)","",N,perl = TRUE)

说明: -

[.]         // Match a dot
(?=         // Followed by
    [^.]    // Any character that is not a dot.
     *      // with 0 or more repetition
     $      // Till the end. So, there should not be any dot after the dot we match.
)  

因此,只要在前瞻中匹配dot(.),匹配就会失败,因为在当前点之后某处有dot,模式匹配。

答案 2 :(得分:3)

我确定您现在知道这一点,因为您在包中使用了stringi,但您可以这样做

N <- c("59.22.07", "58.01.32", "57.26.49")

stringi::stri_replace_last_fixed(N, ".", "")
# [1] "59.2207" "58.0132" "57.2649"

答案 3 :(得分:1)

我对我的正则表达式很懒,但这很有效:

gsub("(*)(.)([0-9]+$)","\\1\\3",N)

我倾向于从标准中采取相反的方法。而不是替换'。'使用零长度字符串,我只需要解析两边的两个部分。