Извлечь подстроку после последней точки - PullRequest
0 голосов
/ 15 января 2019

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

a = c("a.b.c.d", "e.b.e", "c", "f.d.e", "a.e.b.g.z")
gsub(".*(\\..*)$", "\\1", a)

Код возвращается

".d" ".e" "c"  ".e" ".z"

Как мне изменить код, чтобы получить

"d" "e" ""  "e" "z"

То есть, если строка содержит точку, она удалит последнюю часть без точки; если строка не содержит точку, она вернет "".

Ответы [ 2 ]

0 голосов
/ 15 января 2019

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

a = c("a.b.c.d", "e.b.e", "c", "f.d.e", "a.e.b.g.z")
sub(".*\\.", "", a)

[1] "d" "e" "c" "e" "z"

Если вы хотите вернуть пустую строку, если у ввода нет точки, тогда мы можем использовать ifelse с grepl:

input <- "Hello World!"
output <- ifelse(grepl("\\.", input), sub(".*\\.", "", input), "")

Причина подробного кода выше в том, что sub по умолчанию просто возвращает исходную строку, если совпадение не найдено. Но в вашем случае вы хотите другое поведение.

0 голосов
/ 15 января 2019

Вам нужно . вне группы захвата, поскольку вам это не нужно

sub(".*\\.(.*)", "\\1", a)
#[1] "d" "e" "c" "e" "z"

Это будет захватывать все после последней точки.

Для строк, у которых нет точек, мы можем проверить это, используя grepl, а затем извлечь

ifelse(grepl("\\.", a), sub(".*\\.(.*)", "\\1", a), "")
#[1] "d" "e" ""  "e" "z"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...