海报希望使用正则表达式(不是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"
答案 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)
我倾向于从标准中采取相反的方法。而不是替换'。'使用零长度字符串,我只需要解析两边的两个部分。