Skip to main content
 首页 » 编程设计

python之正则表达式匹配地址与子模式

2025年05月04日23davidwang456

我正在尝试创建一个正则表达式来将地址解析为五个部分:“address1”,这是街道地址,“address2”,这是公寓号或地址第 2 行显示的任何其他内容,城市、州和邮政编码。

当我运行它时,Python(或 Django)在我运行 re.search 时抛出一个错误,指出“模式意外结束”。谁能告诉我如何修改这个正则表达式以正确匹配?

我是一个正则表达式菜鸟。我可以弄清楚这个应该做什么,但我永远不可能自己写出来。我从 http://regexlib.com/REDetails.aspx?regexp_id=472 得到这个.

re.compile(r""" 
(?x)^(?n: 
(?<address1> 
    (\d{1,5}(\ 1\/[234])?(\x20[A-Z]([a-z])+)+ ) 
    | (P.O. Box \d{1,5}))\s{1,2} 
(?<city> 
    [A-Z]([a-z])  
        + (\.?)(\x20[A-Z]([a-z])+){0, 2})\, \x20 
(?<state> 
    A[LKSZRAP] | C[AOT] | D[EC] | F[LM] | G[AU] | HI 
    | I[ADL N] | K[SY] | LA | M[ADEHINOPST] | N[CDEHJMVY] 
    | O[HKR] | P[ARW] | RI | S[CD] | T[NX] | UT | V[AIT]  
    | W[AIVY]  
    | [A-Z]([a-z]) 
        + (\.?)(\x20[A-Z]([a-z])+){0,2})\x20 
(?<zipcode> 
    (?!0{5})\d{5}(-\d {4})?) 
)$" 
""", re.VERBOSE) 

为了可读性添加了换行符。作为后续问题,这个正则表达式是否可以像这样分成多行以提高可读性,还是需要全部在一行中才能工作(我想我可以将单独的行连接起来)?

附言我知道这听起来像家庭作业,但实际上是为了工作。

编辑:请求使用的实际代码,所以就在这里。我将其排除在外是因为这里的所有内容实际上都已经存在了,但也许它会有所帮助。

该函数是 Django View 的一部分,但这对我们的目的来说应该无关紧要。

def parseAddress(address): 
  pattern = r"^(?n:(?<address1>(\d{1,5}(\ 1\/[234])?(\x20[A-Z]([a-z])+)+ )|(P\.O\.\ Box\ \d{1,5}))\s{1,2}(?i:(?<address2>(((APT|APARTMENT|BLDG|BUILDING|DEPT|DEPARTMENT|FL|FLOOR|HNGR|HANGER|LOT|PIER|RM|ROOM|S(LIP|PC|T(E|OP))|TRLR|TRAILER|UNIT)\x20\w{1,5})|(BSMT|BASEMENT|FRNT|FRONT|LBBY|LOBBY|LOWR|LOWER|OFC|OFFICE|PH|REAR|SIDE|UPPR|UPPER)\.?)\s{1,2})?)(?<city>[A-Z]([a-z])+(\.?)(\x20[A-Z]([a-z])+){0,2})\, \x20(?<state>A[LKSZRAP]|C[AOT]|D[EC]|F[LM]|G[AU]|HI|I[ADL N]|K[SY]|LA|M[ADEHINOPST]|N[CDEHJMVY]|O[HKR]|P[ARW]|RI|S[CD] |T[NX]|UT|V[AIT]|W[AIVY]|[A-Z]([a-z])+(\.?)(\x20[A-Z]([a-z])+){0,2})\x20(?<zipcode>(?!0{5})\d{5}(-\d {4})?))$" 
  match = re.search(pattern, address) 

我使用我的家庭住址作为输入,但我尝试将“123 Main St., Austin, TX 12345”作为输入,结果相同。

请您参考如下方法:

有些人可能不认为这是一个答案,但请耐心等待一分钟。

我强烈建议不要尝试使用正则表达式解析街道地址。街道地址在任何意义上都不是“常规”的。有无限的变化,除非您限制自己使用非常有限的语法,否则总会有您无法解析的字符串。大量的时间和金钱已投入到解析地址的解决方案中,首先是美国邮局和众多列表清理服务提供商。只需谷歌“解析街道地址”即可了解问题的范围。有商业解决方案和一些免费解决方案,但网络上的评论表明没有人总是正确的。

我也是经验之谈。在 80 年代,我在一家数据库排版公司工作,我们必须解析地址。我们从未开发出完美运行的解决方案,对于我们自己捕获的数据(我们有一个大型键盘输入部门),我们开发了一种特殊的符号语法,以便运算符(operator)可以在适当的位置插入定界符以帮助解析过程。

看看那里的一些免费服务。您会省去很多麻烦。