2013-04-10 79 views
3

我试图把它用pyparsing的成分解析部分标准化的街道地址。我想要非贪婪地匹配一个可能是N个令牌的街道名称。PyParsing非贪婪匹配

例如:

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

使用否定~来检查即将到来的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,你可以简单地使用上面的语法。恕我直言,它导致了一个更干净的语法定义。

+0

很不错的答案,希望我可以给第二个给予好评的替代形式'setResultsName'尖端。到OP:解析街道地址极为复杂,有在pyparsing维基(http://pyparsing.wikispaces.com/file/view/streetAddressParser.py/135329743/streetAddressParser.py)可能给你更多的样本一个跳跃的开始。 – PaulMcG 2013-04-30 04:37:42