Как извлечь текст между двумя словами, используя str_extract? - PullRequest
2 голосов
/ 07 октября 2019

Я пытаюсь извлечь строку между двумя фиксированными строками. В частности, я хочу строку, которая состоит из нескольких строк, между «Адрес:» и «Это предоставление». Вот пример:

Address:
The PowerPool Corp                                                  
1434 Holyfried Route, Unit A                                                 
Melope, VA 21151

This grant is issued

Я попробовал следующий код, но он не работает:

str_extract(test_case, "(?<=Address:\n)[^\\n]+")

, который выводит

[1] "The PowerPool Corp"

Как получитьвсе три строки адреса?

Ответы [ 4 ]

2 голосов
/ 07 октября 2019

Вы можете получить совпадения без точечного режима, сначала сопоставив Адрес: и затем захватите в группе 1 все строки, которые не начинаются с «Этого гранта»

Address:\r?\n((?:(?!This grant\b).*(?:\r?\n|$))*)

По частям

  • Address:\r?\n Адрес совпадения: и новая строка
  • ( Захват группа 1
    • (?: Группа без захвата
      • (?!This grant\b).* Совпадение по всем строкам, если то, что непосредственно справа, не является «этим разрешением»
      • (?:\r?\n|$) Сопоставление либо с новой строки, либо с утверждением конца строки
    • )* Закрыть группу без захвата и повторить, чтобы получить все строки
  • )

Например

library(stringr)
test_case <- "Address:
The PowerPool Corp
1434 Holyfried Route, Unit A
Melope, VA 21151

This grant is issued"

str_match(test_case, "Address:\\r?\\n((?:(?!This grant\\b).*(?:\\r?\\n|$))*)")[,2]

Вывод

[1] "The PowerPool Corp\n1434 Holyfried Route, Unit A\nMelope, VA 21151\n\n"

Regex demo | R демо

2 голосов
/ 07 октября 2019

Использование sub в базе R, кажется, работает нормально:

cat(sub("Address:(.*)This grant.*", "\\1", test_case))

#The PowerPool Corp                                                  
#1434 Holyfried Route, Unit A                                                 
#Melope, VA 21151

Использование cat для отображения вывода в отформатированном виде.

данные

test_case <- "Address:
The PowerPool Corp                                                  
1434 Holyfried Route, Unit A                                                 
Melope, VA 21151

This grant is issued"
0 голосов
/ 07 октября 2019

В str_extract . не будет соответствовать терминаторам строки (\n), если вы не скажете это. Используйте функцию модификатора regex с аргументом dotall = T для сопоставления по нескольким строкам. Обратите внимание, что я также исправил ваше регулярное выражение, удалив [^\\n]+ и добавив .* плюс внешний вид (?=\n\nThis grant):

str_extract(test_case,
            regex("(?<=Address:\n).*(?=\n\nThis grant)",
                  dotall = T
                  )
            )

# [1] "The PowerPool Corp\n1434 Holyfried Route, Unit A\nMelope, VA 21151"

Также могут быть более простые / быстрые способы решения этой проблемы. Например, если вы знаете, что первые и последние строки всегда являются ненужными, вы можете разбить их на \n, а затем выбрать соответствующие строки или удалить ненужные строки, например str_split(test_case, "\n")[[1]][2:4] против str_split(test_case, "\n")[[1]][-c(1, 5, 6)].

0 голосов
/ 07 октября 2019

Этот ответ прост и хорош, на всякий случай, у нас было бы несколько адресов, может быть,

Address:\\s*(.*?)\\s*This grant\\b

, и замена \\1 также была бы вариантом. .

Демо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...