Операция Pyparsing OR использует самую короткую строку, когда совпадает более двух

Мне нужно разобрать некоторые операторы, но мне нужна гибкость использования нескольких слов для обозначения оператора.

eg.

string = """
start some statement end
other stuff in between
start some other statement.
other stuff in between
start another statement
"""

в этом случае end, . и конец строки являются маркерами, которые будут сигнализировать о конце оператора, который я ищу.

Я пробовал следующее:

from pyparsing import restOfLine, SkipTo

skip_to_end_of_line = restOfLine
skip_to_dot = SkipTo('.', include=False)
skip_to_end = SkipTo('end', include=False)

statement = 'start' + skip_to_end_of_line^skip_to_dot^skip_to_end

statement.searchString(string)

([(['start some statement end\nother stuff in between\nstart some other statement'], {}), (['start', ' another statement'], {})], {})

Используя функцию ИЛИ, она возвращает самую большую строку, если совпадений больше двух, я хотел бы, чтобы ИЛИ возвращал самую короткую строку, в результате чего

([(['start', ' some statement end'], {}), (['start', ' some other statement.'], {}), (['start', ' another statement'], {})], {})

person EDWhyte    schedule 28.07.2016    source источник


Ответы (1)


SkipTo — одна из наименее предсказуемых особенностей pyparsing, поскольку входные данные легко могут быть такими, что они приводят к большему или меньшему пропуску, чем хотелось бы.

Попробуйте это вместо этого:

term = LineEnd().suppress() | '.' | 'end'
statement = 'start' + OneOrMore(~term + Word(alphas)) + term

Вместо слепого пропуска это выражение итеративно находит слова и останавливается, когда находит одно из ваших конечных условий.

Если вам нужна фактическая строка тела вместо набора слов, вы можете использовать originalTextFor:

statement = 'start' + originalTextFor(OneOrMore(~term + Word(alphas))) + term
person PaulMcG    schedule 28.07.2016
comment
Я попробовал подход с первым совпадением с SkipTo, но, как вы сказали, он пропустил прямо к первому совпадению в последовательности первого совпадения. Ваш ответ работает на 100% - person EDWhyte; 29.07.2016