2013-04-10 73 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