Regex для новой строки не могу понять - PullRequest
0 голосов
/ 11 января 2020

Я пытаюсь получить все, что следует «в год» и предшествует «Все налоги», но не могу найти регулярное выражение для этого.

Я пробовал пару регулярных выражений, но по какой-то причине не сработало. Кто-нибудь может помочь? Пытался использовать регулярные выражения и python, но оба не работали.

> r'per annum\\.(.+)\nAll taxes are assessed'
> 
> r'per annum\\.\n(.+)\nAll taxes are assessed'

> r'per annum(.+)nAll taxes are assessed'

interest charges at 8.0 % per annum.

MCMAHON, DENISE M
%RDM PROPERTIES
PO BOX 653
GOFFSTOWN NH 03045
MCMAHON, RAYMOND J
All taxes are assessed as of April 1st of each year.  Unless 
directed otherwise, tax bills are mailed to the last known 
address of the first owner l

Ответы [ 4 ]

1 голос
/ 11 января 2020

Это решение Python:

import re
text = 'your text here'
match = re.search(r'\bper annum\.\s*(.+?)\nAll taxes are assessed', text, re.S)
if match:
  print(match.group(1))

См. Демонстрация регулярного выражения

(.+?) захватывает любой текст между per annum. и новой строкой затем All taxes are assessed. Обратите внимание, что точка после annum экранируется, поскольку это специальный символ регулярного выражения. . соответствует окончанию строки благодаря re.S flag .

Кроме того, re.search находит первое совпадение с регулярным выражением, match.group(1) получает захват в группе 1.

1 голос
/ 11 января 2020
per annum.\n([\S\s]*)All taxes

Может работать на вас. [\ S \ s] соответствует любому символу, включая символ новой строки.

0 голосов
/ 11 января 2020

Уже есть другие ответы, которые будут работать, но этот ответ более точно отвечает на вопрос «Regex for new line». В регулярном выражении точка соответствует любому символу, кроме разделителей строки. Таким образом, вы хотите сопоставить и захватить любой символ или символ новой строки. Я поместил эту часть в группу без захвата, но это не является строго необходимым. Вместо этого вы можете игнорировать все совпадения, сделанные внутренней группой.

Я предполагаю, что вы не хотите захватывать пустую строку, поэтому я поставил еще одну новую строку перед группой захвата.

r'per annum\.\n\n((?:.|\n)+)\nAll taxes'

Подход [\ s \ S], как уже упоминалось, также работает.

0 голосов
/ 11 января 2020

Вы запутались в необработанных строках. В необработанной строке Python обратная черта sh просто представляет обратную косую черту sh. Но затем механизм регулярных выражений интерпретирует их.

r'\\', так как регулярное выражение соответствует буквальному символу обратного хода sh.

r'\n', поскольку регулярное выражение соответствует новой строке.

r'\.' (или r'[.]' или '\\.' без префикса r) совпадает с литеральной точкой.

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

Кроме того, если, конечно, вы хотите сопоставить несколько строк, скажите так:

r'per annum\.(\n.+)+?All taxes are assessed'

Ненасытный +? говорит, что нужно сопоставить как можно меньше повторений, а не столько, сколько возможно.

...