python pyparsing单词excludeChars

python pyparsing单词excludeChars,python,pyparsing,Python,Pyparsing,我正在尝试为一个可以包含“\u1”的数字创建一个解析器。我希望在输出中抑制下划线。例如,一个有效单词应该是1000_000,它应该返回一个数字:1000000。 我已经为此尝试了excludeChars关键字参数,因为我的理解是,这应该执行以下操作: 如果提供,此参数指定不被视为匹配的字符,即使这些字符在其他情况下被视为匹配 摘自第33页第5.35节(参考btw) 以下是我的尝试: import pyparsing as pp num = pp.Word(pp.nums+'_', exclude

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

如果提供,此参数指定不被视为匹配的字符,即使这些字符在其他情况下被视为匹配

摘自第33页第5.35节(参考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'], {})

有什么建议吗?

简单地替换下划线字符怎么样

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

你误解了排外的目的。它不是用来抑制输出中的那些字符,而是作为对初始字符串和正文字符串中给定字符的重写。那么这个

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

Word(nums)
添加excludeChars是因为用户多次希望定义以下词语:

  • 除“:”之外的所有可打印内容
  • 除“,”或“.”之外的所有可打印内容
  • 除…之外的所有可打印内容
在添加excludeChars之前,唯一的方法是采用笨重的外观:

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

你现在可以写了

Word(printables, excludeChars=',.')
在您的例子中,您希望解析数值,允许嵌入'\u',但只返回数值。这对于解析操作来说是一个很好的例子:

integer = Word(nums+'_').setParseAction(lambda t: t[0].replace('_',''))
integer = Word(nums+'_').setParseAction(lambda t: int(t[0].replace('_','')))
integer.parseString('1_000')  -->  [1000]
解析操作在解析时被调用以进行过滤和转换。您甚至可以将转换为int作为解析操作的一部分:

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

这是一个很好的建议,特别是基于我给出的人为示例,但是这个解析器是更复杂的解析器的一部分。嗯,你的建议可能仍然可以利用。如果我这里没有直接的答案,我会把你的答案记下来。