#r #regex #stringr
Вопрос:
Я пользуюсь stringr
библиотекой в R
. Ниже приведена выдержка из моих кодов R:
library(stringr)
...
hotelname <- url %>% html_nodes(xpath = './/*[@id="hp_hotel_name"]') %>%
html_text()
Приведенный выше код дает мне следующий вывод:
"nHotelnCove Boutique Hotel (Adults Only)n"
Мне нужно извлечь только вторую часть: «Бутик-отель Cove (только для взрослых)»
Я попробовал следующее, но это не работает:
hotelname2 <- str_extract_all(hotelname, "(?<=[A-Z]n)([^n]*)")
Есть идеи, что не так с моими приведенными выше кодами регулярных выражений?
Комментарии:
1. Всегда ли эта строка находится между вторым и третьим n?
Ответ №1:
Обрежьте n пробелов на концах, а затем удалите все, вплоть до n включительно
x <- "nHotelnCove Boutique Hotel (Adults Only)n"
sub(".*n", "", trimws(x))
## [1] "Cove Boutique Hotel (Adults Only)"
или сканируйте в полях, разделенных n, и возьмите второе:
scan(text = x, what = "", sep = "n", quiet = TRUE)[2]
## [1] "Cove Boutique Hotel (Adults Only)"
или используйте обрезки, а затем считывайте строки:
readLines(textConnection(trimws(x)))[2]
## [1] "Cove Boutique Hotel (Adults Only)"
Ответ №2:
Вы хотите извлечь текст между n
и n
?
hotelname <- "nHotelnCove Boutique Hotel (Adults Only)n"
sub('.*n(.*)n', '\1', hotelname)
[1] "Cove Boutique Hotel (Adults Only)"
Ответ №3:
Если вы все stringr
равно используете, одна приятная функция- str_squish()
это удаление всех пробелов, символов новой строки и т. Д.
hotelname2 <- str_squish(hotelname)
Я часто вставляю его непосредственно в трубку, когда соскабливаю:
hotelname <- url %>% html_nodes(xpath = './/*[@id="hp_hotel_name"]') %>%
html_text() %>% str_squish
Ответ №4:
В качестве альтернативы вы можете использовать str_extract
регулярные выражения «смотреть вперед» и «смотреть за», чтобы получить желаемый результат
hotelname <- "nHotelnCove Boutique Hotel (Adults Only)n"
hotelname2 <- str_extract(hotelname, "(?<=Hoteln).*(?=n)")
Здесь,»? Мы добавляем «.*» между ними, чтобы вернуть все между двумя совпадениями.