Удалить последнее появление символа
Вопрос встретил сегодня talkstats.com, в котором плакат хотел удалить последний период строки с использованием регулярного выражения (не strsplit
). Я сделал попытку сделать это, но не увенчался успехом.
N <- c("59.22.07", "58.01.32", "57.26.49")
#my attempts:
gsub("(!?\\.)", "", N)
gsub("([\\.]?!)", "", N)
Как мы могли удалить последний период в строке, чтобы получить:
[1] "59.2207" "58.0132" "57.2649"
Ответы
Ответ 1
Может быть, это немного улучшится:
gsub("(.*)\\.(.*)", "\\1\\2", N)
[1] "59.2207" "58.0132" "57.2649"
Поскольку он жадный, первый (.*)
будет соответствовать всем до последнего .
и сохранит его в \\1
. Второй (.*)
будет соответствовать всем после последнего .
и сохранит его в \\2
.
Это общий ответ в том смысле, что вы можете заменить \\.
любым выбранным вами персонажем, чтобы удалить последнее появление этого символа. Это только одна замена!
Вы даже можете сделать:
gsub("(.*)\\.", "\\1", N)
Ответ 2
Вам нужно это регулярное выражение: -
[.](?=[^.]*$)
И замените его на пустую строку.
Итак, это должно выглядеть так: -
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
где-то после текущей точки, шаблон соответствует.
Ответ 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"
Ответ 4
Я довольно ленив с моим регулярным выражением, но это работает:
gsub("(*)(.)([0-9]+$)","\\1\\3",N)
Я имею тенденцию придерживаться противоположного подхода со стандартом. Вместо замены '.' с строкой нулевой длины, я просто разбираю две части, которые находятся с обеих сторон.