Сопоставление пробела в начале строки с использованием pyparsing - PullRequest
1 голос
/ 20 ноября 2010

Я пытаюсь проанализировать унифицированный diff-файл, используя pyparsing в качестве упражнения, и я не могу что-то сделать правильно.Вот часть моего файла различий, которая доставляет мне неприятности:

(... some stuff over...)
 banana
+apple
 orange

Первая строка начинается с "", затем "банан".У меня есть следующее выражение для разбора строки:

linestart = Literal(" ") | Literal("+") | Literal("-")
line = linestart.leaveWhitespace() + restOfLine

Это работает при разборе одной строки, но когда я пытаюсь проанализировать весь файл, инструкция "exitWhitespace" заставляет парсер запускаться в концепоследняя строкаВ моем примере, после разбора «banana», следующим символом является «\ n» (из-за поля leftWhitespace), и анализатор пытается сопоставить «» или «+» или «-» и выдает ошибку.* Как я могу справиться с этим правильно?

1 Ответ

1 голос
/ 20 ноября 2010

Вы можете читать и анализировать по одной строке за раз. Следующий код работает для меня.

from pyparsing import Literal, restOfLine

linestart = Literal(" ") | Literal("+") | Literal("-")
line = linestart.leaveWhitespace() + restOfLine

f = open("/tmp/test.diff")
for l in f.readlines():
  fields = line.parseString(l)
  print fields

И вывод

[' ', 'banana']
['+', 'apple']
[' ', 'orange']

Или, если вам нужно разобрать несколько строк, вы можете явно указать LineEnd

linestart = Literal(" ") | Literal("+") | Literal("-")
line = linestart.leaveWhitespace() + restOfLine + LineEnd()
lines = ZeroOrMore(line)
lines.parseString(f.read())
...