Python 找到不需要的令牌

Python 找到不需要的令牌,python,pyparsing,Python,Pyparsing,我正在尝试使用pyparsing编写一个街道地址解析器。粘滞点在街道名称中捕获了多个单词,而没有贪婪地捕获后缀(例如AVE、BLVD、ST)。这就是我到目前为止所做的: DIRS = ['NORTH', 'N', 'SOUTH', 'S', 'EAST', 'E', 'WEST', 'W'] SUFFIXES = ['ST', 'AVE', 'BLVD', 'RD'] primary_num = pp.Word(pp.alphanums) predir = pp.Optional(pp.one

我正在尝试使用pyparsing编写一个街道地址解析器。粘滞点在街道名称中捕获了多个
单词
,而没有贪婪地捕获后缀(例如AVE、BLVD、ST)。这就是我到目前为止所做的:

DIRS = ['NORTH', 'N', 'SOUTH', 'S', 'EAST', 'E', 'WEST', 'W']
SUFFIXES = ['ST', 'AVE', 'BLVD', 'RD']

primary_num = pp.Word(pp.alphanums)
predir = pp.Optional(pp.oneOf(DIRS) + pp.Optional(pp.Suppress('.')))
suffix = pp.Optional(pp.oneOf(SUFFIXES) + pp.Optional(pp.Suppress('.')))
postdir = pp.Optional(pp.oneOf(DIRS) + pp.Optional(pp.Suppress('.')))
street_name = pp.OneOrMore(~suffix + ~postdir + pp.Word(pp.alphanums))
line_1 = primary_num + predir + street_name + suffix + postdir
如果我对乔治华盛顿大街123号运行此命令,我会得到一个错误:

pyparsing.ParseException: Found unwanted token, [{Re:('ST|AVE|BLVD|RD') [Suppress:(".")]}] (at char 4), (line:1, col:5)

这个错误听起来像乔治的G在匹配
Re:('ST|AVE | BLVD | RD')
。有人知道这里发生了什么吗?

首先向解析器添加一些调试:

predir.setName("predir").setDebug()
street_name.setName("street_name").setDebug()
您可以看到您正在匹配可选的predir。不要在predir、suffix和postdir定义中定义可选性,而是在第_1行的定义中将它们定义为可选的

line_1 = primary_num + pp.Optional(predir) + street_name + 
            pp.Optional(suffix) + pp.Optional(postdir)
您还将发现,dir和后缀的定义应该将它们视为关键字,而不是与其中一个匹配的文本类型。相反,请使用caselesskywords:

predir = pp.MatchFirst(map(pp.CaselessKeyword,DIRS)) + pp.Optional(pp.Suppress('.'))
suffix = pp.MatchFirst(map(pp.CaselessKeyword,SUFFIXES)) + pp.Optional(pp.Suppress('.'))
postdir = pp.MatchFirst(map(pp.CaselessKeyword,DIRS)) + pp.Optional(pp.Suppress('.'))
最后,将街道名称中的多个单词分组,使其与任何pre或post元素分开:

street_name = pp.Group(pp.OneOrMore(~suffix + ~postdir + pp.Word(pp.alphanums)))
通过这些更改,我们可以得到以下结果:

['123', ['GEORGE', 'WASHINGTON'], 'AVE']

DIRS
是一个定向关键字列表——我将此添加到问题中。您可以在pyparsing wiki示例页面上与街道地址解析器比较注释: