Подтвердить что ты не робот

Удалить последнее появление символа

Вопрос встретил сегодня 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"
4b9b3361

Ответ 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)

Я имею тенденцию придерживаться противоположного подхода со стандартом. Вместо замены '.' с строкой нулевой длины, я просто разбираю две части, которые находятся с обеих сторон.