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

Я пытаюсь извлечь заголовки некоторых таблиц из простого текста с регулярным выражением на python.

Простой тест был экспортирован из некоторых файлов PDF, которые имели много \n с.Я пытался остановить сопоставление перед первым появлением шаблона \n \n\n, но регулярное выражение всегда возвращало мне еще несколько символов.

Вот пример.

Строка была:

contents = '\n\n\n\n\n\n\n\nClient: ABC area: Location Mc\nHole: 33-44   \n \n\n \n\nKJK TechCen    Rep # 5243 \n \n\n \n\n95 \n\nTable 3.1:  Joined Liq L1 (P = 40 \n@ 12), Test With 2 % \n\noF \n \n\n PressRel V \n% \n\nLiq/To \n% \n\nLiq/Sat \nBu \n\nDenCom'

Я использовал регулярное выражение:

re.findall(r'Table *\d.+:* *[a-zA-Z0-9 :&–=\n%@,()°-]+ [^ \n \n\n ]', contents)

Я хотел, чтобы результирующая строка начиналась с 'Table XXX' и заканчивалась прямо передfirst ' \n \n\n ', вот так:

'Table 3.1:  Joined Liq L1 (P = 40 \n@ 12), Test With 2 % \n\noF '

Но фактическая строка, которую я получил, была:

'Table 3.1:  Joined Liq L1 (P = 40 \n@ 12), Test With 2 % \n\noF \n \n\n PressRel V'

Так, как я мог изменить регулярное выражение, чтобы избавиться от надоедливых '\n \n\n PressRel V'

Ответы [ 2 ]

1 голос
/ 27 марта 2019

Вам нужен не жадный +? вместо +, так как все символы, которые появляются в конечной последовательности, находятся в средних скобках.

end = r' \n \n\n '
result = re.findall(r'Table[^:]*:[a-zA-Z0-9 :&–=\n%@,()°-]+?' + end, contents)
#result = ['Table 3.1:  Joined Liq L1 (P = 40 \n@ 12), Test With 2 % \n\noF \n \n\n ']

# to chop off the end, if needed:
result = [x[:-len(end)] for x in result]

Часть [^ \n \n\n ] в вашем примере равна [^ \n], "Символ, который не является новой строкой или пробелом"

1 голос
/ 27 марта 2019

Вместо использования класса символов вы можете использовать положительный прогноз (?=, чтобы утверждать, что то, что должно следовать, прямо справа.

Table *\d.+:* *[a-zA-Z0-9 :&–=\n%@,()°-]+(?= \n \n\n )

Regex demo

Или вы можете записать свои значения в группу и сопоставить новые строки после

(Table *\d.+:* *[a-zA-Z0-9 :&–=\n%@,()°-]+) \n \n\n 

Демонстрация регулярного выражения с использованием группы

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