python pyparsing word excludeChars

时间:2015-12-02 12:50:25

标签: python pyparsing

我正在尝试为包含' _'的数字创建解析器。我希望在输出中抑制下划线。例如,有效单词为1000_000,应返回一个数字:1000000。 我已经为此尝试了excludeChars关键字参数,因为我的理解是应该执行以下操作:

  

"如果提供,则此参数指定不被视为匹配的字符,即使这些字符被认为匹配。"

取自http://infohost.nmt.edu/tcc/help/pubs/pyparsing/pyparsing.pdf - 第33页第5.35节(伟大的pyparsing reference 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'], {})

有什么建议吗?

2 个答案:

答案 0 :(得分:1)

如何简单地替换下划线字符?

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

答案 1 :(得分:1)

您误解了excludeChars的目的。它不是从输出中抑制那些字符,而是作为对初始字符串和正文字符串中给出的字符的覆盖。所以这个

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

相同
Word(nums)

添加了excludeChars,因为很多时候用户想要定义以下字词:

  • 除了':'
  • 之外的所有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('_',''))

在解析时调用解析操作以进行过滤和转换。您甚至可以将转换包含在解析操作的一部分中:

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