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

#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 ] .