R: найдите последнюю точку в строке
В R есть лучший/более простой способ, чем следующее: найти местоположение последней точки в строке?
x <- "hello.world.123.456"
g <- gregexpr(".", x, fixed=TRUE)
loc <- g[[1]]
loc[length(loc)] # returns 16
Это находит все точки в строке, а затем возвращает последний, но кажется довольно неуклюжим. Я пытался использовать регулярные выражения, но не очень далеко.
Ответы
Ответ 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)
Мне нравится, потому что он напрямую создает желаемое местоположение, не просматривая результаты. Регулярное выражение также довольно чистое, что является небольшим исключением, когда речь идет о регулярных выражениях.