2014-12-18 78 views
3

這裏是我的代碼:Pyparsing分隔的列表僅返回第一個元素

l = "1.3E-2 2.5E+1" 
parser = Word(alphanums + '+-.') 
grammar = delimitedList(parser,delim='\t ') 
print(grammar.parseString(l)) 

它返回:

['1.3E-2'] 

Obiously,我希望所有的這兩個值,不是單一的一個,任何想法是怎麼回事上 ?

回答

6

作品,如果你切換到原始字符串:

l = r"1.3E-2\t2.5E+1" 
parser = Word(alphanums + '+-.') 
grammar = delimitedList(parser, delim=r'\t') 
print(grammar.parseString(l)) 

打印:

['1.3E-2', '2.5E+1'] 

一般來說,delimitedList可與類似PDPDP其中P是解析目標和D是delimter或劃界序列。

您有delim='\t '。具體而言,是1個選項卡後跟1個空格的分隔符;它不是標籤或空間。

6

正如@dawg所解釋的,delimitedList適用於您將表達式分隔爲非空白分隔符(通常爲逗號)的情況。 Pyparsing隱式跳過空白,所以在pyparsing世界中,你真正看到的不是一個分隔列表,而是OneOrMore(realnumber)。另外,除非使用parseWithTabs=True參數,否則parseString會在所提供的輸入字符串內部調用str.expandtabs。將製表符擴展爲空格有助於保持列表形式的數據的列對齊,並且當我最初編寫pyparsing時,這是一個流行的用例。

如果您可以控制此數據,那麼您可能希望使用與<TAB>不同的分隔符,可能是逗號或分號。如果您堅持使用此格式,但決定使用pyparsing,請使用OneOrMore。

隨着您的前進,您還希望更精確地瞭解您定義的表達式和您使用的變量名稱。 「解析器」這個名稱並不是很豐富,Word(alphanums+'+-.')的模式在科學記數法中除了有效的實際值之外還會匹配很多事物。我知道如果你只是想任何東西工作,這是一個合理的第一次切割,你可以回來調整它,一旦你得到了什麼。如果事實上你將要分析的實數,這裏是一個可能有用的表達式:

realnum = Regex(r'[+-]?\d+\.\d*([eE][+-]?\d+)?').setParseAction(lambda t: float(t[0])) 

然後,你可以定義你的語法爲「零或更多(realnum)」,這也是很多更多的自我解釋。解析操作會將您的字符串轉換爲解析時的浮點數,這會在實際使用解析的值時爲您節省一些時間。

祝你好運!

+0

感謝保羅對這個問題的答覆,特別是詳細的解釋。我將移動到OneOrMore(它實際上是我嘗試的第一件事,但這個原始字符串錯誤讓我看起來像delimitedList)。我正在使用這個正則表達式,關於變量名稱的同樣的事情,爲了簡單起見,我只寫了一個快速而骯髒的例子。 – Overdrivr

相關問題