Regex смотреть за пределом в R - PullRequest
0 голосов
/ 18 марта 2019

Я пытаюсь извлечь числовое значение (элементы с жирным шрифтом) рядом с ключевым словом «High» в тексте ниже. Но я получаю ошибку как

"Ошибка в stri_extract_first_regex (строка, шаблон, opts_regex = opts (шаблон)): Совпадения шаблонов Look-Behind должны иметь ограниченную максимальную длину. (U_REGEX_LOOK_BEHIND_LIMIT) "

Регулярное выражение, которое я использовал:

"(?<=High\\s*>?=?\\s?)[\\d\\.]+[\\s\\-\\d\\.]+(?=\\s)").

Это работает в онлайн-тестере regex, но когда я делаю то же самое в Rstudio, я получаю вышеуказанную ошибку

Текст

 Optimal             <2.6  Desirable           2.6 - 3.3  Borderline high     3.4 - 4.0  High                ***4.1 - 4.8***  Very high           >=4.9

 Desirable       <5.2  Borderline high 5.2 - 6.1  High            >= ***6.2***

 Desirable   <1.7  Borderline High 1.7 - 2.2  High      ***2.3 - 4.4***  Very high >=4.5

Обратите внимание, что я использовал двойную косую черту, поскольку она написана на языке R. Однако здесь, в SO, он показывает только одну косую черту

Вы можете мне помочь?

1 Ответ

0 голосов
/ 18 марта 2019

образец данных

Я изменил одно «Граничный максимум» на «Граничный максимум». Предполагаемая опечатка.

v <- c("Optimal             <2.6  Desirable           2.6 - 3.3  Borderline high     3.4 - 4.0  High                4.1 - 4.8  Very high           >=4.9",
       "Desirable       <5.2  Borderline high 5.2 - 6.1  High            >= 6.2",
         "Desirable   <1.7  Borderline high 1.7 - 2.2  High      2.3 - 4.4  Very high >=4.5")

код

library(dplyr)
library(stringr)
data.frame( text = v, stringsAsFactors = FALSE ) %>%
  #Extract text between "High" and "Very", trim whirespace
  dplyr::mutate( High = trimws( stringr::str_extract(text, "(?<=High).*(?=Very)") ) ) %>%
  #If no text was extracted, take everything after "High" until the end
  dplyr::mutate( High = ifelse( is.na( High ), trimws( stringr::str_extract(text, "(?<=High).*(?=$)") ), High ) ) %>%
  dplyr::select( High )

выход

#        High
# 1 4.1 - 4.8
# 2    >= 6.2
# 3 2.3 - 4.4

обновление

Принимайте значения только после High, если High равно , а не , перед которым стоит [a-zA-Z].

data.frame( text = v, stringsAsFactors = FALSE ) %>%
  #Extract text between "High" and "Very", trim whirespace
  dplyr::mutate( High = trimws( stringr::str_extract(text, "(?<=[^a-zA-Z] High).*(?=Very)") ) ) %>%
  #If no text was extracted, take everything after "High" until the end
  dplyr::mutate( High = ifelse( is.na( High ), trimws( stringr::str_extract(text, "(?<=[^a-zA-Z] High).*(?=$)") ), High ) ) %>%
  dplyr::select( High )
       High
1 4.1 - 4.8
2    >= 6.2
3 2.3 - 4.4
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...