Используя R, как извлечь несколько URL-адресов / шаблонных совпадений из строки в наборе данных, а затем поместить каждый URL-адрес в отдельный смежный столбец? - PullRequest
0 голосов
/ 09 января 2019

У меня есть (большой) набор данных, который изначально состоит из идентификатора и связанного текста (в необработанном HTML). Часто текст будет содержать одну или несколько встроенных ссылок. Вот пример набора данных:

id text
1  <p>I love dogs!</p>
2  <p>My <strong>favorite</strong> dog is <a href="www.doge.com">this kind</a>.</p>
3  <p>I've had both <a href="labs.com">Labs</a> and <a href="http://www.huskies.com">Huskies</a> in my life.</p>

То, что я хотел бы получить в качестве результата (со столбцом text, включенным в то же место, но я удалил его для наглядности здесь), будет:

id link1     link2
1        
2  doge.com
3  labs.com  huskies.com

Я пытался использовать str_extract_all() в паре с <a\s+(?:[^>]*?\s+)?href=(["'])(.*?)\1, но даже когда я дважды удаляю обратную косую черту, я либо получаю "неожиданную" ошибку, либо она продолжает просить меня о большем, и мне приходится сбегать. Я чувствую, что этот метод - тот, который я хочу и ДОЛЖЕН работать, но я не могу заставить регулярное выражение играть хорошо. Вот мои результаты:

> str_extract_all(text, "<a\s+(?:[^>]*?\s+)?href=(["'])(.*?)\1")
Error: '\s' is an unrecognized escape in character string starting ""<a\s"
> str_extract_all(text, perl(<a\s+(?:[^>]*?\s+)?href=(["'])(.*?)\1))
Error: unexpected '<' in "str_extract_all(text, perl(<"
> str_extract_all(text, "<a\\s+(?:[^>]*?\\s+)?href=(["'])(.*?)\\1")
+ 

> str_extract_all(text, perl(<a\\s+(?:[^>]*?\\s+)?href=(["'])(.*?)\\1))
Error: unexpected '<' in "str_extract_all(text, perl(<"

Я также пробовал parseURI из пакета XML и по какой-то причине он завершает мой сеанс R.

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

При необходимости я мог бы допустить создание отдельного набора данных и объединение их вместе, но будут случаи, когда нет ссылок, поэтому я бы хотел избежать любых ловушек удаляемых строк из-за отсутствия значения в каком-либо из столбцов link.

1 Ответ

0 голосов
/ 09 января 2019

R не любит кавычки в строках, поэтому в приведенном выше примере R рассматривает текущую строку:

str_extract_all(text, "<a\\s+(?:[^>]*?\\s+)?href=(["'])(.*?)\\1")

R все еще ищет конец строки, поскольку она не была экранирована в регулярном выражении. В R есть особые случаи, когда для выхода можно использовать как одиночный \ (например, \n для новой строки), см. this . \' экранирует одинарную кавычку, а \" экранирует двойную кавычку в регулярном выражении R:

str_extract_all(text, "<a\\s+(?:[^>]*?\\s+)?href=([\"])(.*?)\\1", text, perl=T)

"\ само по себе является специальным символом, который необходимо экранировать, например, \\ d. Не путать эти регулярные выражения с R escape-последовательностями, такими как \ Т. "

или в вашем случае \"

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