2016-07-28 36 views
1

我需要解析一些語句,但希望靈活使用多個單詞來表示語句。當兩個以上匹配時,Pyparsing OR操作使用最短字符串

例如。

string = """ 
start some statement end 
other stuff in between 
start some other statement. 
other stuff in between 
start another statement 
""" 
在這種情況下 end.和行末

是將信號結束時,我正在尋找的聲明 令牌。

我試過如下:

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'], {})], {}) 

通過使用或功能,如果有兩個以上的比賽返回最大的字符串,我想還是要回到最短串 導致

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

回答

2

SkipTo是pyparsing不太可預測的特性之一,因爲輸入數據很容易導致比預期更多或更少的跳過。

試試這個:

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

而是一味地跳過的,這種表達反覆查找的話,當它發現你的終止條件之一停止。

如果你想實際體字符串代替文字的集合,你可以使用originalTextFor

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

我嘗試了比賽第一種方法與SkipTo但就像你說的很對跳過在第一場比賽匹配第一個序列。你的答案100% – EDWhyte