Потяните объекты, что Вы хотите быть в назад немного позади объектов, что Вы хотите быть в передней стороне. Таким образом, на самом деле изменитесь, значение z (принимающий z перпендикулярно экранной плоскости). Вы не должны изменять его много, чтобы заставить объекты тянуть друг перед другом. И если Вы только изменяете значение z немного, Вы не должны замечать большую часть смещения от их желаемого положения. Вы могли даже пойти действительно необычные, и вычислить корректный x, y положение на основе сменившего z положения, так, чтобы объект появился, где это, как предполагается, находится.
Думаю, эта проблема подойдет для правильного генератора парсеров. Регулярные выражения слишком сложно тестировать и отлаживать, если они ошибаются. Однако я бы выбрал генератор синтаксического анализатора, который прост в использовании, как если бы он был частью языка.
Для такого типа задач я бы использовал pyparsing, поскольку он обладает мощностью полного анализатора lr, но без трудностей. граммер для определения и очень хорошие вспомогательные функции. Код также легко читается.
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']
Вы можете группировать вещи, как хотите, но для простоты я только что вернул списки. Пробелы по умолчанию игнорируются, что значительно упрощает работу
Я не знаю, есть ли эквиваленты в других языках.
Вы дали два образца шаблонов для текстовых файлов.
Я думаю, что с этим можно справиться с помощью скриптов.
Что-то вроде: AWK, sed, grep со сценарием bash.
Один шаблон в первом примере,
Местоположение
[Число]
Количество продуктов в разделе может быть различным.
Количество разделов в файле может быть различным.
Продукты и цены всегда указаны в соответствующих строках раздела.
Разделение пробелов определяет ассоциацию столбцов (продукт, цена)
.
Количество товаров в разделе соответствует количеству цен в этом разделе.
Собранные данные, вероятно, будут ассимилированы в базе данных.
Я знаю, что я бы использовал здесь только регулярные выражения. Три или четыре выражения могут управлять логикой синтаксического анализа для каждого формата электронной почты.
Пытаться написать механизм синтаксического анализа в более общем плане, чем это, я думаю, означало бы избежать его чрезмерного программирования.