Какое регулярное выражение позволит мне найти ближайший номер к слову до или после слова - PullRequest
0 голосов
/ 28 января 2019

У меня есть предложения следующим образом

"There is a 10cm length of Barrett's"
"The length of Barrett's is around 5 cm"
"The Barrett's measures 10cm in length above a 4cm hiatus hernia"
"The length of Barrett's is 5cm but the length of the dysplasia is 3cm"

Я хочу извлечь длину Барретта как часть оператора ifelse

    ifelse(grepl("(\\.|^)(?=[^\\.]*cm)(?=[^\\.]*Barr)(?=[^\\.]*(of |length))[^\\.]*(\\.|$)", 
dataframe[,EndoReportColumn], perl=TRUE,ignore.case = TRUE),
stringr::str_extract(stringr::str_match(dataframe[,EndoReportColumn],"(\\.|^)(?=[^\\.]*cm)(?=[^\\.]*[Bb]arr)[^\\.]*(\\.|$)"),"\\d"),"None Found")

У меня проблема в том, что извлеченные числаневерны, если в предложении есть два числа, поэтому я получаю следующий результат для предложения:

10
5
4
3

Как узнать, какое число ближе всего (до или после) к слову Барретт впредложение, которое содержит слова длины и Барретта в любом порядке?

Ответы [ 2 ]

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

Вероятно, это не самый лучший / самый короткий / самый быстрый ответ, но он обеспечивает необходимые результаты и может быть легко расширен, когда данные становятся более сложными.

выборка данных

vec <- c( "There is a 10cm length of Barrett's",
"The length of Barrett's is around 5 cm",
"The Barrett's measures 10cm in length above a 4cm hiatus hernia",
"The length of Barrett's is 5cm but the length of the dysplasia is 3cm")

код

library( tidyverse )

l <- lapply( vec, function(x) {
  data.frame( value = as.numeric( unlist( str_extract_all( x, "[0-9]+" ) ) ),
              position = as.numeric( unlist( gregexpr( "[0-9]+", x) ) ) )
  })
matches <- as.data.frame( data.table::rbindlist(l, idcol = "id" ) )

df <- data.frame( text = vec, stringsAsFactors = FALSE )
pattern_ <-"Barrett's"

library( tidyverse )
df %>%
  mutate( id = row_number(),
          start_barrett = regexpr( pattern_, text),
          end_barrett = start_barrett + nchar( pattern_ ) ) %>%
  left_join( matches, by = "id" ) %>%
  mutate( distance = ifelse( position > start_barrett, position - end_barrett, start_barrett - position ) ) %>%
  group_by( id ) %>%
  arrange( distance ) %>%
  slice( 1L ) %>%
  ungroup() %>%
  select( text, value )

выход

# # A tibble: 4 x 2
#   text                                                                  value
#   <chr>                                                                 <dbl>
# 1 There is a 10cm length of Barrett's                                      10
# 2 The length of Barrett's is around 5 cm                                    5
# 3 The Barrett's measures 10cm in length above a 4cm hiatus hernia          10
# 4 The length of Barrett's is 5cm but the length of the dysplasia is 3cm     5
0 голосов
/ 28 января 2019

Попробуйте это регулярное выражение:

(\d+\s*\w+)[^\d\r\n]*Barret|[^\d\r\n]*Barret[^\d\r\n]*(\d+\s*\w+)

Нажмите для демонстрации

Немного программирования, вы можете извлечь содержимое группы1 / 2.

Примечание: Это решение разработано с учетом предоставленных примеров строк.Кроме того, экранируйте каждый \ с другим \.

(\\d+\\s*\\w+)[^\\d\\r\\n]*Barret|[^\\d\\r\\n]*Barret[^\\d\\r\\n]*(\\d+\\s*\\w+)

Объяснение:

  • (\d+\s*\w+) - соответствует 1+ цифрам, за которыми следует 0+ пробелы, за которыми следуют 1+ слов, чтобы соответствовать и захватить длину вместе с ее единицей в Группа 1
  • [^\d\r\n]*Barret - соответствует 0+ вхождений любого символа, не являющегося ни новой строкойни возврат каретки, ни цифра, за которой следует слово Barret
  • | - ИЛИ
  • [^\d\r\n]*Barret[^\d\r\n]* - соответствует 0+ вхождений любого символа, который не является ни новой строкой, ни переводом каретки, ницифра сопровождается словом Barret.За этим снова следует 0+ вхождений любого символа, который не является ни новой строкой, ни переводом каретки, ни цифрой, за которой следует слово Barret.
  • (\d+\s*\w+) - соответствует 1+ цифрам, за которыми следует 0+ пробеловсопровождаемый 1+ символами слова, чтобы соответствовать и захватить длину вместе с ее единицей в Группа 2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...