R Regex захватить группу? - PullRequest
       2

R Regex захватить группу?

0 голосов
/ 28 февраля 2019

У меня много таких строк:

2019/01/01/07/556662_cba3a4fc-cb8f-4150-859f-5f21a38373d0

Я хочу извлечь подстроку, которая лежит сразу после последней "/" и заканчивается на "_":

556662

Я узнал, как извлечь: /01/01/07/556662

, используя следующее регулярное выражение: (\/)(.*?)(?=\_)

Пожалуйста, посоветуйте, как мне захватить нужную группу.

Ответы [ 3 ]

0 голосов
/ 28 февраля 2019

Вы можете использовать

x <- "2019/01/01/07/556662_cba3a4fc-cb8f-4150-859f-5f21a38373d0"
regmatches(x, regexpr(".*/\\K[^_]+", x, perl=TRUE))
## [1] "556662"

См. regex и R demo .

Здесь регулярное выражение соответствует и выводит первую подстрокукоторая соответствует

  • .*/ - любые 0+ символов, как можно больше до последнего /
  • \K - пропускает эту часть из матча
  • [^_]+ - ставит 1 или более символов, отличных от _, в значение совпадения.

Или sub решение:

sub(".*/([^_]+).*", "\\1", x)

См. regex demo .

Здесь оно аналогично предыдущему, но 1 или более символов, отличных от _, включены в группу 1 (\1в шаблоне замены) и завершающий .* убедитесь, что весь вход согласован (и использован, готов к замене).

Альтернативные неосновные решения R

Если вы можете позволить себе или предпочитаете работать с stringi, вы можете использовать

library(stringi)
stri_match_last_regex("2019/01/01/07/556662_cba3a4fc-cb8f-4150-859f-5f21a38373d0", ".*/([^_]+)")[,2]
## [1] "556662"

Это будет соответствовать строке до последнего / и попадет в Группу 1 (к которой вы обращаетесь вколонка2 с использованием [,2]) 1 или более символов, отличных от _.

или

stri_extract_last_regex("2019/01/01/07/556662_cba3a4fc-cb8f-4150-859f-5f21a38373d0", "(?<=/)[^_/]+")
## => [1] "556662"

Это извлечет последнее совпадение строки, состоящей из 1 или более символов, отличных от_ и / после /.

0 голосов
/ 28 февраля 2019

Я изменил правила Regex в соответствии с кодом Wiktor Stribiżew.

x <- "2019/01/01/07/556662_cba3a4fc-cb8f-4150-859f-5f21a38373d0"
regmatches(x, regexpr(".*/([0-9]+)", x, perl=TRUE))
sub(".*/([0-9]+).*", "\\1", x)

Вывод

[1] "2019/01/01/07/556662"

[1] "556662"

R демо

0 голосов
/ 28 февраля 2019

Вы можете использовать группу захвата:

/([^_/]+)_[^/\s]*

Объяснение

  • / Совпадение буквально
  • ([^_/]+) Захватв группе, не совпадающей с подчеркиванием или косой чертой
  • _[^/\s]* Совпадение _, а затем 0+ раз не косая черта или пробел

Regex demo | R demo

Одним из вариантов получения группы захвата может быть получение второго столбца с помощью str_match:

library(stringr)
str = c("2019/01/01/07/556662_cba3a4fc-cb8f-4150-859f-5f21a38373d0")
str_match(str, "/([^_/]+)_[^/\\s]*")[,2]

# [1] "556662"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...