我正在尝试从以下示例行中提取id和数据。 我将id定义为具有alphanums和其他一些字符但不包括逗号的内容。我希望pyparsing不要将数据的1位作为id的一部分,因为数据是连续的块,其中包括逗号和逗号从id中排除。 pyparsing是否应该完全拒绝数据部分作为id,因为连续的数据块包含id部分中未定义的其他字符?我的期望是规则适用于整个单词而不是单词
extern _main
输出我
(['XXX Y / 1231',',234.567890'],{'data':[(',234.567890',1)],'id':[('XXX Y / 1231',0)] })
我希望输出 (['XXX Y / 123','1,234.567890'],{'data':[('1,234.567890',1)],'id':[('XXX Y / 123',0)]})
答案 0 :(得分:1)
通常Word
通常会在空格上进行解析,但是不能保证找到它。我尝试更改您的解析器以添加Word
的可选asKeyword=True
参数,并使用Regex
与周围的\b
标记一起使用,但在这两种情况下, ','在1,234.567890
中满足了正常的分词行为。
最简单的解决方案是在匹配OneOrMore
之前在Word(alphanums+'-/.')
内插入否定前瞻:
number = Word(nums+',.()')
parser= OneOrMore(~number + Word(alphanums+'-/.'))('id')\
.setParseAction(joinTokensViaSpace) + number('data')
这样,在开始另一个Word
之前,解析器首先检查它是否处于潜在的number
,并且只有在它不存在时才进行检查。通过此更改,解析的输出将如您所愿。 (也许我应该向stopOn
和OneOrMore
添加一个ZeroOrMore
参数,就像OneOrMore(Word(alphanums+'-/.'), stopOn=number)
一样 - 这对于pyparsing开发人员来说确实是一个非常常见的陷阱。)
我也看到你正在使用结果名称 - 这是一个很好的习惯。由于您拥有它们,我建议您使用dump()
作为检查ParseResults
返回的parseString
结构的最佳工具。
result = parser.parseString(' XXX Y/123 1,234.567890')
print result.dump()
打印
['XXX Y/123', '1,234.567890']
- data: 1,234.567890
- id: XXX Y/123