Сохранить строку до второй косой черты в регулярном выражении?

#r #regex

#r #регулярное выражение

Вопрос:

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

У меня есть следующая строка:

 x <- c('/youtube.com/videos/cats', '/google.com/images/dogs', 'bbc.com/movies')

/youtube.com/videos/cats
/google.com/images/dogs
bbc.com/movies
  

Итак, это будет выглядеть так

 /youtube.com/
/google.com/
bbc.com/
  

Для справки я использую R 3.6

Я пробовал положительные поисковые запросы, и самым близким, что я получил, было это: ^/[^/]*

Любая помощь приветствуется

Итак, в bbc.com/movies примере — строка не начинается с косой черты / но я все равно хочу иметь возможность сохранить bbc.com часть во время сопоставления

Комментарии:

1. ваша попытка была близка, вы можете сделать gsub('(^/?[^/]*/)|.', '\1', x)

Ответ №1:

Вы можете использовать sub здесь, чтобы выполнить только одну замену регулярного выражения:

 sub('^(/?[^/]*/).*', '\1', x)
  

Смотрите демонстрацию регулярных выражений.

Подробные сведения

  • ^ — начало строки — (/?[^/]*/) — Захват группы 1 ( 1 в шаблоне замены): необязательный / , затем 0 или более символов, отличных от / , а затем /
  • .* — любые нулевые или более символов, как можно больше.

Смотрите тест R онлайн:

 test <- c("/youtube.com/videos/cats", "/google.com/images/dogs", "bbc.com/movies")
sub('^(/?[^/]*/).*', '\1', test)
# => [1] "/youtube.com/" "/google.com/"  "bbc.com/"   
  

Комментарии:

1. Возможно ли захватить и вторую группировку? итак, до, но включая 3-ю косую черту, если она существует? например youtube.com/cats/dogs/beans захватил бы youtube.com/cats/dogs / только?

2. @BeansOnToast ^(/?[^/]*(?:/[^/]*){2}).* , смотрите демонстрацию .

Ответ №2:

Первое отличное имя пользователя. Попробуйте это, вы можете использовать тот факт, что str_extract извлекает только первое совпадение. предполагая, что все URL-адреса соответствуют буквам.буквы, этот шаблон должен работать. Дайте мне знать, если у вас есть числа в любом из них.

 library(stringr) 
c("/youtube.com/videos/cats",
  "/google.com/images/dogs",
  "bbc.com/movies") %>% 
   str_extract(., "/?\w \.\w /")
  

выдает

 "/youtube.com/" "/google.com/"  "bbc.com/"  
  

Ответ №3:

Использование базового R

 gsub('(\/?.*\.com\/).*', '\1', x)
[1] "/youtube.com/" "/google.com/"  "bbc.com/"     
  

Ответ №4:

альтернативой может быть пакет rebus:

 library(rebus)
library(stringi)

t <-  c("/youtube.com/videos/cats"," /google.com/images/dogs"," bbc.com/movie")

 pattern <- zero_or_more("/") %R% one_or_more(ALPHA) %R% DOT %R% one_or_more(ALPHA) %R% zero_or_more("/")

 stringi::stri_extract_first_regex(t, pattern) 

[1] "/youtube.com/" "/google.com/"  "bbc.com/"