#python #regex
#python #регулярное выражение
Вопрос:
Я пытаюсь извлечь заголовки некоторых таблиц из обычного текста с помощью регулярного выражения на python.
Простой тест был экспортирован из некоторых PDF-файлов, в которых было много n
s. Я пытался остановить сопоставление до первого появления шаблона n nn
, но регулярное выражение всегда возвращало мне еще несколько символов.
Вот пример.
Строка была:
contents = 'nnnnnnnnClient: ABC area: Location McnHole: 33-44 n nn nnKJK TechCen Rep # 5243 n nn nn95 nnTable 3.1: Joined Liq L1 (P = 40 n@ 12), Test With 2 % nnoF n nn PressRel V n% nnLiq/To n% nnLiq/Sat nBu nnDenCom'
Регулярное выражение, которое я использовал, было:
re.findall(r'Table *d. :* *[a-zA-Z0-9 :amp;–=n%@,()°-] [^ n nn ]', contents)
Я хотел, чтобы результирующая строка начиналась с 'Table XXX'
и заканчивалась прямо перед первой ' n nn '
, вот так:
'Table 3.1: Joined Liq L1 (P = 40 n@ 12), Test With 2 % nnoF '
Но фактическая строка, которую я получил, была:
'Table 3.1: Joined Liq L1 (P = 40 n@ 12), Test With 2 % nnoF n nn PressRel V'
Итак, как я мог бы изменить регулярное выражение, чтобы избавиться от раздражающего 'n nn PressRel V'
?
Комментарии:
1. Затем используйте предварительный просмотр или группу захвата,
Table *d. :* *[a-zA-Z0-9 :amp;–=n%@,()°-] (?= n nn )
смотрите демонстрацию или эту демонстрацию .
Ответ №1:
Вместо использования символьного класса вы могли бы использовать позитивный прогноз (?=
, чтобы утверждать, что то, что должно следовать, находится прямо справа.
Table *d. :* *[a-zA-Z0-9 :amp;–=n%@,()°-] (?= n nn )
Демонстрация регулярных выражений
Или вы могли бы записать свои значения в группу и сопоставить новые строки следующим образом
(Table *d. :* *[a-zA-Z0-9 :amp;–=n%@,()°-] ) n nn
Ответ №2:
Вам нужно нежадное ?
вместо
, поскольку все символы, которые появляются в конечной последовательности, заключены в средние скобки.
end = r' n nn '
result = re.findall(r'Table[^:]*:[a-zA-Z0-9 :amp;–=n%@,()°-] ?' end, contents)
#result = ['Table 3.1: Joined Liq L1 (P = 40 n@ 12), Test With 2 % nnoF n nn ']
# to chop off the end, if needed:
result = [x[:-len(end)] for x in result]
[^ n nn ]
Часть в вашем примере равна [^ n]
«Символу, который не является символом новой строки или пробелом»
Комментарии:
1. Этот метод также хорошо работал. Спасибо за объяснение
[^ n nn ]
.