Python pyparsing单词排除字符

3
我正在尝试制作一个解析器,用于解析包含“_”的数字。我希望在输出结果中省略下划线。例如,有效的单词应该是1000_000,应返回数字:1000000。 我已经尝试使用excludeChars关键字参数来实现这一点,我的理解是它应该执行以下操作:

“如果提供了此参数,则指定不考虑匹配的字符,即使这些字符否则被视为匹配。”

引用自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'], {})

有任何建议吗?

2个回答

2
您误解了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]

1

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

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

这是一个不错的建议,特别是基于我提供的人为示例,但这个解析器是更复杂解析器的一部分。嗯,你的建议可能仍然可以利用。如果我在这里没有得到直接的解决方案,我会将你的建议标记为答案。 - Gregory Kuhn

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接