pyparsing定义一个单词作为连续的字符块

时间:2016-02-01 23:09:00

标签: pyparsing

我正在尝试从以下示例行中提取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)]})

1 个答案:

答案 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,并且只有在它不存在时才进行检查。通过此更改,解析的输出将如您所愿。 (也许我应该向stopOnOneOrMore添加一个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