2015-12-02 138 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

这是一个很好的建议,特别是基于做作的例子,我给了,但这解析器形成更复杂的解析器的一部分。那么,你的建议可能仍然可以利用。如果我在这里没有得到直接的解决方案,我会将你的答案标记为答案。 –