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

R: найдите последнюю точку в строке

В R есть лучший/более простой способ, чем следующее: найти местоположение последней точки в строке?

x <- "hello.world.123.456"
g <- gregexpr(".", x, fixed=TRUE)
loc <- g[[1]]
loc[length(loc)]  # returns 16

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

4b9b3361

Ответ 1

Это работает для вас?

x <- "hello.world.123.456"
g <- regexpr("\\.[^\\.]*$", x)
g
  • \. соответствует точке
  • [^\.] соответствует всем, кроме точки
  • * указывает, что предыдущее выражение (все, кроме точки) может иметь место между 0 и неограниченными временами
  • $ обозначает конец строки.

Принимая все вместе: найдите точку, за которой следует что-либо, кроме точки, до конца строки. R требует, чтобы \ был экранирован, следовательно \\ в приведенном выше выражении. См. regex101.com, чтобы поэкспериментировать с регулярным выражением.

Ответ 2

Как насчет незначительного улучшения синтаксиса?

Это будет работать для вашего литерала, где вектор ввода имеет длину 1. Используйте escape-последовательности, чтобы получить литерал ".". поиск и обратный результат, чтобы получить последний индекс как "первый":

 rev(gregexpr("\\.", x)[[1]])[1]

Более подходящая векторная версия (в случае, если x больше 1):

 sapply(gregexpr("\\.", x), function(x) rev(x)[1])

и другой более аккуратный вариант вместо использования хвоста:

sapply(gregexpr("\\.", x), tail, 1)

Ответ 3

Кто-то отправил следующий ответ, который мне очень понравился, но я заметил, что он его удалил:

regexpr("\\.[^\\.]*$", x)

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