2010-11-20 13 views
1

J'essaye d'analyser un fichier diff unifié en utilisant le pyparage comme un exercice et je ne peux pas obtenir quelque chose de bien. Voici la partie de mon fichier diff qui me provoque trouble:Correspondance d'un espace au début d'une ligne à l'aide de pyparsing

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

La première ligne commence par « » puis « banane ». Je l'expression suivante pour l'analyse d'une ligne:

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

Cela fonctionne lors de l'analyse d'une seule ligne, mais lorsque je tente d'analyser le fichier entier, l'instruction « leaveWhitespace » faire le début de l'analyseur à la fin de la dernière ligne. Dans mon exemple, après l'analyse de "banana", le prochain caractère est "\ n" (à cause de leaveWhitespace) et l'analyseur essaye de faire correspondre "" ou "+" ou "-" et lance ainsi une erreur.

Comment puis-je gérer cela correctement?

+0

Qui donne des devoirs sur pyparsing ?! – PaulMcG

+0

Moi, ce n'est pas des devoirs, je veux juste apprendre à pyper. – subb

+0

Veuillez visiter le wiki à http://pyparsing.wikispaces.com. Il existe des liens vers des documents et des articles en ligne. Et n'hésitez pas à poster des questions sur l'onglet Discussion de la page d'accueil du wiki. Bienvenue à pyparsing! – PaulMcG

Répondre

1

Vous pouvez lire et analyser une ligne à la fois. Le code suivant fonctionne pour moi.

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 

Et la sortie est

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

Ou si vous devez analyser plusieurs lignes, vous pouvez spécifier explicitement le LineEnd

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

Oui, cela fonctionne, mais le problème est que j'ai un tas d'autres parser pour d'autres parties du fichier. J'avoue que mon exemple était un peu simplifié. Je vais ajouter quelques détails à l'article original. – subb

+0

Vous devriez toujours pouvoir analyser une ligne par ligne, même avec d'autres éléments du fichier. Mais j'ai mis à jour ma réponse pour inclure un moyen d'analyser le fichier entier en tant que chaîne. Je dois dire que je suis novice en pypars et je ne sais pas si c'est la meilleure pratique. –