Какие коды регулярных выражений позволили бы мне извлечь этот конкретный текст?

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

Здесь,»? Мы добавляем «.*» между ними, чтобы вернуть все между двумя совпадениями.