2016-07-28 18 views
1

Ich brauche einige Aussagen zu analysieren, aber die Flexibilität der Verwendung mehrerer Wörter, um die Aussage zu signalisieren.Pyparsing ODER Operation verwenden kürzeste Zeichenfolge, wenn mehr als zwei übereinstimmen

z.

string = """ 
start some statement end 
other stuff in between 
start some other statement. 
other stuff in between 
start another statement 
""" 

in diesem Fall end sind . und Ende der Zeile die Tokens, die das Ende der Erklärung die ich suche signalisiert.

Ich habe versucht, die folgenden:

from pyparsing import restOfLine, SkipTo 

skip_to_end_of_line = restOfLine 
skip_to_dot = SkipTo('.', include=False) 
skip_to_end = SkipTo('end', include=False) 

statement = 'start' + skip_to_end_of_line^skip_to_dot^skip_to_end 

statement.searchString(string) 

([(['start some statement end\nother stuff in between\nstart some other statement'], {}), (['start', ' another statement'], {})], {}) 

Durch die Verwendung von ODER-Funktion es die größte String zurückgibt, wenn es mehr als zwei Spiele sind, würde Ich mag, oder die kürzeste Zeichenfolge was

([(['start', ' some statement end'], {}), (['start', ' some other statement.'], {}), (['start', ' another statement'], {})], {}) 
zurückzukehren

Antwort

2

SkipTo ist eine der weniger vorhersehbaren Eigenschaften von PIPS, da es für Eingabedaten so einfach ist, dass sie mehr oder weniger überspringen als gewünscht.

Versuchen Sie stattdessen:

term = LineEnd().suppress() | '.' | 'end' 
statement = 'start' + OneOrMore(~term + Word(alphas)) + term 

Statt blind Skipping, dieser Ausdruck iterativ Worte findet, und stoppt, wenn eine Ihrer Abschlussbedingungen findet.

Wenn Sie die tatsächliche Körper Zeichenfolge anstelle der Sammlung von Wörtern möchten, können Sie originalTextFor verwenden:

statement = 'start' + originalTextFor(OneOrMore(~term + Word(alphas))) + term 
+0

Ich habe versucht, eine Übereinstimmung ersten Ansatz mit skipto aber wie Sie sagten, dass sie übersprungen Recht auf das erste Spiel in der passe die erste Sequenz an. Deine Antwort funktioniert 100% – EDWhyte