Разделение текста на строки с помощью pyparsing

Я пишу свою первую программу, которая использует pyparsing.

Я хочу проанализировать файл, в котором каждая строка, заканчивающаяся на "\n", является токеном.

Пожалуйста, объясните, как это сделать.

На самом деле мне нужно разобрать файлы .lyx. Один из примеров файла .lyx: https://github.com/nicowilliams/lyx/blob/master/lib/examples/Braille.lyx


person porton    schedule 22.07.2015    source источник
comment
Каков запрашиваемый результат?   -  person omri_saadon    schedule 22.07.2015
comment
@omri_saadon: На первом этапе я хочу просто разбить файл на строки. (Токен — это строка.) После этого (трюк!) я собираюсь разобрать каждый токен с помощью другого анализатора. То есть я сначала разобью на токены, потом разберу каждый токен.   -  person porton    schedule 22.07.2015
comment
Основной синтаксический анализатор использует этот (другой) синтаксический анализатор для определения интересных последовательностей токенов. Второй парсер используется только для проверки свойств токенов, остальная работа выполняется основным парсером   -  person porton    schedule 22.07.2015
comment
Если ваши шаги действительно настолько независимы, то я бы предложил просто использовать splitlines(), чтобы разбить исходную строку на строку, а затем передать каждую в синтаксический анализатор, что-то вроде for line in input_string.splitlines(): result = line_parser.parseString(line). Вы даже можете использовать встроенную сумму, подобную этой, чтобы объединить все результаты в единая структура (обратите внимание на использование Group вокруг синтаксического анализатора строк для разделения данных каждой строки): all_results = sum(Group(line_parser).parseString(line) for line in input_string.splitlines())   -  person PaulMcG    schedule 23.07.2015


Ответы (1)


Представляется, что следующее решает задачу:

import sys
import pyparsing # parsley

all_files = sys.argv[1:]

if not all_files:
    print "Usage: DuplicateRefs.py FILE.lyx ...\n"
    sys.exit(1)

def mylambda(tok):
    print tok

parser = pyparsing.ZeroOrMore(pyparsing.CharsNotIn("\n").setParseAction(mylambda) + pyparsing.White("\n"))

for file in all_files:
    parser.parseFile(file)
person porton    schedule 22.07.2015
comment
Определенно делает то, о чем просил OP - вместо White("\n") попробуйте LineEnd(), мне никогда не нравилось, когда парсеры явно анализируют пробелы и избегают этого, если могу. - person PaulMcG; 23.07.2015