2015-12-02 58 views
2

我正在嘗試爲包含'_'的數字創建解析器。我希望下劃線在輸出中被抑制。例如,一個有效的字會1000_000它應該會返回一個數字:1000000 我曾嘗試excludeChars此關鍵字參數作爲我的理解是,這應該做到以下幾點:python pyparsing word excludeChars

「如果提供,該參數指定不被認爲匹配的字符,即使這些字符被認爲是匹配的。「

http://infohost.nmt.edu/tcc/help/pubs/pyparsing/pyparsing.pdf摘自 - 第33頁部分5.35(大pyparsing BTW參考)

所以,下面是我的嘗試:

import pyparsing as pp 
num = pp.Word(pp.nums+'_', excludeChars='_') 
num.parseString('123_4') 

,但我最終的結果是 '123',而不是' 1234'

In [113]: num.parseString('123_4') 
Out[113]: (['123'], {}) 

有什麼建議嗎?

回答

0

你曲解excludeChars的目的。它並不是要從輸出中抑制這些字符,它是作爲對初始字符串和正文字符串中給出的字符的覆蓋而存在的。因此,這

Word(nums+'_', excludeChars='_') 

只是一樣

Word(nums) 

excludeChars加入,因爲有很多次,用戶想定義類的字眼:

  • 除了所有printables「:」
  • 所有的printables除了','或'。'
  • 除了所有printables ...

excludeChars前加入的,要做到這一點是笨重的前瞻性的唯一途徑:

Word(''.join(c for c in printables if c != ':')) 

Word(printables.replace(',','')) 

相反,你現在可以寫

Word(printables, excludeChars=',.') 

在你的情況下,你想解析數值,允許嵌入'_',但只返回數字。這將是一個很好的案例分析行動:

integer = Word(nums+'_').setParseAction(lambda t: t[0].replace('_','')) 

解析操作被稱爲在解析時間做過濾和轉換。你甚至可以爲int爲您解析動作的一部分轉換:

integer = Word(nums+'_').setParseAction(lambda t: int(t[0].replace('_',''))) 
integer.parseString('1_000') --> [1000] 
1

如何簡單地替換下劃線字符?

"123_4".replace("_", "") 
# "1234" 
+0

這是一個很好的建議,特別是基於做作的例子,我給了,但這解析器形成更復雜的解析器的一部分。那麼,你的建議可能仍然可以利用。如果我在這裏沒有得到直接的解決方案,我會將你的答案標記爲答案。 –