Извлечение текста в два столбца из строки

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