這裏是我的代碼:Pyparsing分隔的列表僅返回第一個元素
l = "1.3E-2 2.5E+1"
parser = Word(alphanums + '+-.')
grammar = delimitedList(parser,delim='\t ')
print(grammar.parseString(l))
它返回:
['1.3E-2']
Obiously,我希望所有的這兩個值,不是單一的一個,任何想法是怎麼回事上 ?
這裏是我的代碼:Pyparsing分隔的列表僅返回第一個元素
l = "1.3E-2 2.5E+1"
parser = Word(alphanums + '+-.')
grammar = delimitedList(parser,delim='\t ')
print(grammar.parseString(l))
它返回:
['1.3E-2']
Obiously,我希望所有的這兩個值,不是單一的一個,任何想法是怎麼回事上 ?
作品,如果你切換到原始字符串:
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個空格的分隔符;它不是標籤或空間。
正如@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)」,這也是很多更多的自我解釋。解析操作會將您的字符串轉換爲解析時的浮點數,這會在實際使用解析的值時爲您節省一些時間。
祝你好運!
感謝保羅對這個問題的答覆,特別是詳細的解釋。我將移動到OneOrMore(它實際上是我嘗試的第一件事,但這個原始字符串錯誤讓我看起來像delimitedList)。我正在使用這個正則表達式,關於變量名稱的同樣的事情,爲了簡單起見,我只寫了一個快速而骯髒的例子。 – Overdrivr