Я думаю, что эта проблема подойдет для правильного генератора парсера. Регулярные выражения слишком сложны для тестирования и отладки, если они идут неправильно. Однако я бы выбрал генератор синтаксических анализаторов, который прост в использовании, как если бы он был частью языка.
Для задач такого типа я бы выбрал pyparsing, поскольку он обладает мощью полного синтаксического анализатора, но без сложного грамматического определения и очень хороших вспомогательных функций. Код тоже легко читается.
from pyparsing import *
aaa =""" This is example text that could be many lines long...
another line
Location 1
Product 1 Product 2 Product 3
$20.99 $21.99 $33.79
stuff in here you want to ignore
Location 2
Product 1 Product 2 Product 3
$24.99 $22.88 $35.59 """
result = SkipTo("Location").suppress() \
# in place of "location" could be any type of match like a re.
+ OneOrMore(Word(alphas) + Word(nums)) \
+ OneOrMore(Word(nums+"$.")) \
all_results = OneOrMore(Group(result))
parsed = all_results.parseString(aaa)
for block in parsed:
print block
Возвращает список списков.
['Location', '1', 'Product', '1', 'Product', '2', 'Product', '3', '$20.99', '$21.99', '$33.79']
['Location', '2', 'Product', '1', 'Product', '2', 'Product', '3', '$24.99', '$22.88', '$35.59']
Вы можете группировать вещи, как хотите, но для простоты я только что возвратил списки. Пробелы по умолчанию игнорируются, что значительно упрощает работу.
Я не знаю, есть ли эквиваленты на других языках.