Я хотел бы проанализировать следующий текст, используя Pyparsing :
# It is a comment
# It is a comment
# It is a comment
It is not a comment
# It is a comment
It is not a comment
It is not a comment
It is not a comment
It is not a comment
Каждый блок, состоящий из необязательных описаний и необязательного содержимого и необязательных пустых строк, разделен одной новой строкой персонаж. Значит, у него нет известного формата.
Результат, которого я хотел бы достичь, заключается в следующем. Пожалуйста, обратите внимание на сохранение символов новой строки, когда имеется несколько последовательных пустых строк, что очень важно для составления исходного текста из проанализированного текста:
[
{"description": "# It is a comment"},
{"description": "# It is a comment\n# It is a comment", "content": "It is not a comment\n\n"},
{"description": "# It is a comment", "content": "It is not a comment\nIt is not a comment\n It is not a comment\n"},
{"content": "It is not a comment"}
]
Я пробовал разные решения. Чисто регулярное выражение работает очень хорошо, но я хотел бы лучше воспользоваться инструментом Pyparsing , который мне кажется очень интересным.
Вот реализованный код, в котором проблема с продолжением в бесконечном l oop.
from pyparsing import Group, Literal, ZeroOrMore, restOfLine
data = '''
# It is a comment
# It is a comment
# It is a comment
It is not a comment
# It is a comment
It is not a comment
It is not a comment
It is not a comment
It is not a comment
'''
def bnf():
strip = lambda e: e[0].strip()
join = lambda e: '\n'.join(e[0])
number_sign = Literal('#').suppress()
description = number_sign + restOfLine
description = description.setParseAction(strip)
description = ZeroOrMore(description)
description = Group(description).setParseAction(join)('description')
content = ~number_sign + restOfLine
content = ZeroOrMore(content)
content = Group(content).setParseAction(join, strip)('content')
elements = Group(description + content)
elements = ZeroOrMore(elements)
return elements
tokens = bnf().parseString(data)
print(tokens.dump())
Хотелось бы помимо решения проблемы понять, почему программа зависает в бесконечном l oop.
Спасибо.