我正在尝试为可以包含'_'的数字创建解析器。我希望在输出中取消强调下划线。例如,有效字为1000_000,应返回数字:1000000。
我已经尝试过用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'], {})


有什么建议么?

最佳答案

您误解了excludeChars的目的。它不是抑制输出中的那些字符,它是对初始和主体字符串中给定的字符的替代。所以这

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


与...相同

Word(nums)


添加了excludeChars的原因是,用户有很多次想定义如下单词:


除“:”外的所有可打印内容
除“,”或“。”以外的所有可打印内容
除...以外的所有可打印内容


在添加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]

07-28 02:47