python pyparsing 词 excludeChars

python pyparsing word excludeChars

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

"If supplied, this argument specifies characters not to be considered to match, even if those characters are otherwise considered to match."

取自 http://infohost.nmt.edu/tcc/help/pubs/pyparsing/pyparsing.pdf - 第 33 页第 5.35 节(顺便说一句,很棒的 pyparsing 参考)

下面是我的尝试:

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"

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

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

一样
Word(nums)

添加 excludeChars 是因为用户多次想要定义如下单词:

  • 除“:”之外的所有印刷品
  • 除“,”或“.”之外的所有印刷品
  • 除...之外的所有印刷品

在添加 excludeChars 之前,执行此操作的唯一方法是看起来很笨重:

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

Word(printables.replace(',',''))

现在您可以写

Word(printables, excludeChars=',.')

在您的情况下,您想要解析数值,允许嵌入“_”,但 return 仅允许数字。这将是一个解析操作的好例子:

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]