R Regex со Stringr: символ (0) Ошибка

Я пытаюсь воссоздать старый проект. Однако я предполагаю, что что-то изменилось в пакете stringr, потому что мой код больше не работает. Минимальный рабочий пример (MWE):

library(httr)
library(stringr)
library(XML)
url <- "http://www.lq.com/en/findandbook.html"
page <- GET(url)
s <- content(page, as="text")
push <- unlist(str_match_all(s, "hotelList.push?.+?}")) # stopped working

Сообщение об ошибке:

> push <- unlist(str_match_all(s, "hotelList.push?.+?}")) # stopped working
Error in stri_match_all_regex(string, pattern, cg_missing = "", omit_no_match = TRUE,  : 
Syntax error in regexp pattern. (U_REGEX_RULE_SYNTAX)

Мое исправление:

> push <- unlist(str_match_all(s, "hotelList.push?.+?\\}")) # stopped working
> push
character(0)

Строка s состоит из строк текста. Я пытаюсь найти строки, которые выглядят так:

"hotelList.push({title: \"La Quinta Inn & Suites Phoenix I-10 West\", innNumber: \"0853\", latitude:})"

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

str_match_all(s, "/{(.*?)}/")
str_match_all(s, "/{([^}]*)}/")

Любые советы высоко ценится.


person user2205916    schedule 23.12.2015    source источник


Ответы (1)


Удалите косую черту и экранируйте фигурные скобки.

str_match_all(s, "\\{([^}]*)\\}")

or

str_match_all(s, "\\{\\K[^}]*(?=\\})")
person Avinash Raj    schedule 23.12.2015
comment
Очень полезно. Как мне получить строки с шаблоном: hotelList.push({......})? - person user2205916; 23.12.2015
comment
используйте это "hotelList\\.push\\(\\{.*?\\}\\)" - person Avinash Raj; 23.12.2015
comment
Это не сработало, но это сработало: str_match_all(s, "hotelList\\.push\\(\\{([^}]*)\\}")). Большое спасибо @avinish-raj - person user2205916; 23.12.2015
comment
@user2205916 user2205916, потому что между ними есть разрывы строк, попробуйте "(?s)hotelList\\.push\\(\\{.*?\\}\\)" - person Avinash Raj; 23.12.2015
comment
hotelList.push({title: \La Quinta Inn & Suites Phoenix I-10 West\, innNumber: \0853\, latitude:} возвращается, но как получить просто: {title: \La Quinta Inn & Suites Phoenix I-10 Запад\, номер гостиницы: \0853\, широта:}? - person user2205916; 23.12.2015