#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/"