我正在尝试为可以包含'_'的数字创建解析器。我希望在输出中取消强调下划线。例如,有效字为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]