Регулярное выражение возвращает совпадение плюс строка до следующего совпадения

#python #regex #regex-group

#python #регулярное выражение #python-re

Вопрос:

Цель: разбить текст на список на основе числового или десятичного совпадения, который извлекает весь текст до следующего совпадения, но не включая его. Язык / версия: Python 3.8.5 с использованием python re.findall() и я открыт для альтернативных предложений.

Текстовый пример (да, все это в одной строке):

  1 Something Interesting here 2 More interesting text 2.1 An example of 2C19 a header 2.3 Another header example 2.4 another interesting header 10.1 header stuff  14 the last interesting 3A4 header
  

Вывод цели:

 ['1 Something Interesting here',
'2 More interesting text',
'2.1 An example of 2C19 a header',
'2.3 Another header example',
'2.4 another interesting header',
'10.1 header stuff',
'14 the last interesting 3A4 header'
]
  

Я могу определить большинство подходящих целых / десятичных начальных точек, используя:

(d .d )|([^a-zA-Z]dd)|( d )

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

Чтобы сэкономить вам время, вот моя песочница регулярных выражений

Любезно благодарю вас

Ответ №1:

Вы можете использовать положительные выражения для сопоставления до следующего совпадения.

Вот обновленное регулярное выражение (песочница):

b(?:d (?:.d )?)b.*?(?=b(?:d (?:.d )?)b|$)

В Python:

 regex = r'b(?:d (?:.d )?)b.*?(?=b(?:d (?:.d )?)b|$)'
string = ' 1 Something Interesting here 2 More interesting text 2.1 An example of 2C19 a header 2.3 Another header example 2.4 another interesting header 10.1 header stuff  14 the last interesting 3A4 header'
result = re.findall(regex, string)
  

В этом случае result будет:

 >>> result
['1 Something Interesting here ',
 '2 More interesting text ',
 '2.1 An example of 2C19 a header ',
 '2.3 Another header example ',
 '2.4 another interesting header ',
 '10.1 header stuff  ',
 '14 the last interesting 3A4 header']
  

Обратите внимание, что это решение также извлекает интервал в конце. Если вам не нужен этот интервал, вы можете вызвать strip свои строки:

 >>> [ match.strip() for match in result ]
['1 Something Interesting here',
 '2 More interesting text',
 '2.1 An example of 2C19 a header',
 '2.3 Another header example',
 '2.4 another interesting header',
 '10.1 header stuff',
 '14 the last interesting 3A4 header']