我正在尝试使用部分标准化的街道地址解析它的组件pyparsing.我想非贪婪地匹配一个可能是N令牌长的街道名称.
例如:
444 PARK GARDEN LN
Run Code Online (Sandbox Code Playgroud)
应该解析成:
number: 444
street: PARK GARDEN
suffix: LN
Run Code Online (Sandbox Code Playgroud)
我如何使用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()
Run Code Online (Sandbox Code Playgroud)
但是当我尝试解析它时,街道后缀被默认的贪婪解析行为所吞噬.
使用否定,~检查即将到来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()
Run Code Online (Sandbox Code Playgroud)
此外,你不具备使用setResultsName,你可以简单地使用上面的语法.恕我直言,它导致更清晰的语法定义.