Ich komme gerade nicht drauf - ich würde gerne Leerzeilen als Tokens haben, d.h. \n\n wäre eine Leerzeile, \n\n\n wären zwei etc. Aber irgendwie verschluckt trotz meines umstellen der Whitespacechars pyparsing \n dennoch generell. Das erste Problem wäre Pyparsing sagen, dass es \n\n matchen soll.
Code: Alles auswählen
from pyparsing import Word, Literal, Optional, Group, OneOrMore, nums
watchseries = Word(nums, exact=4)
watchrev = Word(nums, exact=1)
watchname = Group(watchseries + Optional('M') + '-' + watchrev)
leaveempty = Literal('EMPTY')
pagebreak = Literal('\n\n')
pagebreak.setWhitespaceChars(' \t\r')
all = OneOrMore(watchname ^ leaveempty ^ pagebreak)
all.setWhitespaceChars(' \t\r')
t1 = "2134M-2"
t2 = """3245-3
3456M-5"""
t3 = """3256-4
4563-4"""
t4 = """4562M-6
EMPTY
3246-5"""
print all.parseString(t3)
In Zukunft würde ich gerne aus \n+x*\n gerne x NEWLINE-Tokens haben, aber ich weiß gar nicht, ob so etwas überhaupt mit Pyparsing abbildbar ist. Ggf. werde ich wohl den Output durchfiltern und einzeln stehende NEWLINES löschen und NEWLINE-Gruppen einfach um ein Newline kürzen, das sollte wohl auch zum Ziel führen. Oder gibt es einen besseren Weg?
Nur eben wie kann man denn Pyparsing sagen, dass es Linebreaks nicht verschlucken soll?