#r #regex #pattern-matching #stringr
#r #регулярное выражение #сопоставление с образцом #stringr
Вопрос:
У меня есть таблица, в которой в одном столбце содержатся такие данные:
table$test_string<- "[projectname](https://somewebsite.com/projectname/Abc/xyz-09)"
1.) Я пытаюсь извлечь первую часть этой строки в квадратных скобках в одном столбце, т.е.
table$project_name <- "projectname"
использование регулярного выражения:
project_name <- "^\[|(?:[a-zA-Z]|[0-9]) |\]$"
table$project_name <- str_extract(table$test_string, project_name)
Если я протестирую регулярное выражение для 1 значения (1 строки отдельно) таблицы, приведенное выше регулярное выражение работает с использованием
str_extract_all(table$test_string, project_name[[1]][2])
.
Однако я получаю NA, когда применяю шаблон регулярных выражений ко всей таблице, и ошибку, если я использую str_extract_all .
2.) Вторая часть строки, которая является URL-адресом в другом столбце,
table$url_link <- "https://somewebsite.com/projectname/Abc/xyz-09"
Я использую следующее регулярное выражение для URL:
url_pattern <- "http[s]?://(?:[a-zA-Z]|[0-9]|[$-_@.amp; ]|[!*\(\),]|(?:%[0-9a-fA-F][0-9a-fA-F])) "
table$url_link <- str_extract(table$test_string, url_pattern)
и это работает для всей таблицы, однако я все равно получаю последнюю фразу ‘)’ в URL-ссылке.
Чего мне здесь не хватает? и почему первое регулярное выражение работает отдельно, а не для всей таблицы? а для URL-адреса, как мне не получить последний раздел?
Ответ №1:
Похоже, вы могли бы значительно упростить задачу, используя круглые скобки для группового захвата. Например:
test_string<- "[projectname](https://somewebsite.com/projectname/Abc/xyz-09)"
regex <- "\[(.*)\]\((.*)\)"
gsub(regex, "\1", test_string)
#> [1] "projectname"
gsub(regex, "\2", test_string)
#> [1] "https://somewebsite.com/projectname/Abc/xyz-09"
Комментарии:
1. Вау, это было намного проще, чем мой способ! Сработало как шарм!! Огромное спасибо!!
2. Рад помочь! Не стесняйтесь принимать ответ, который вы в конечном итоге используете (есть по крайней мере еще один хороший вариант, который вы можете попробовать).
Ответ №2:
Мы можем использовать удобные функции из qdapRegex
library(qdapRegex)
rm_round(test_string, extract = TRUE)[[1]]
#[1] "https://somewebsite.com/projectname/Abc/xyz-09"
rm_square(test_string, extract = TRUE)[[1]]
#[1] "projectname"
данные
test_string<- "[projectname](https://somewebsite.com/projectname/Abc/xyz-09)"