5

我正在尝试使用pyparsing. 我想非贪婪地匹配一个可能有 N 个标记长的街道名称。

例如:

444 PARK GARDEN LN

应该解析成:

number: 444
street: PARK GARDEN
suffix: LN

我将如何使用 PyParsing 做到这一点?这是我的初始代码:

from pyparsing import *

def main():
    street_number = Word(nums).setResultsName('street_number')
    street_suffix = oneOf("ST RD DR LN AVE WAY").setResultsName('street_suffix')
    street_name = OneOrMore(Word(alphas)).setResultsName('street_name')

    address = street_number + street_name + street_suffix
    result = address.parseString("444 PARK GARDEN LN")
    print result.dump()

if __name__ == '__main__':
    main()

但是当我尝试解析它时,街道后缀会被默认的贪婪解析行为吞噬。

4

1 回答 1

7

使用否定 ,~来检查即将到来street_name的是否真的是street_suffix.

from pyparsing import *

street_number = Word(nums)('street_number')
street_suffix = oneOf("ST RD DR LN AVE WAY")('street_suffix')
street_name = OneOrMore(~street_suffix + Word(alphas))('street_name')

address = street_number + street_name + street_suffix
result = address.parseString("444 PARK GARDEN LN")
print result.dump()

此外,您不必使用setResultsName您可以简单地使用上面的语法。恕我直言,它导致更清晰的语法定义。

于 2013-04-11T13:50:51.040 回答