【发布时间】:2021-11-05 04:41:05
【问题描述】:
我正在尝试创建一个正则表达式来将地址解析为五个部分:“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 视图的一部分,但这对我们的目的来说应该没有太大关系。
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”作为输入,结果相同。
【问题讨论】:
-
是的,您可以使用详细的正则表达式模式(docs.python.org/py3k/howto/regex.html#regex-howto 并在底部找到 re.VERBOSE):您能否提供准确的代码示例,以便人们可以尝试重现您的错误得到了吗?
-
开头的引号前面应该有
r,以使其成为“原始字符串”,其中反斜杠没有特殊含义。 -
@steabert,我会查看 re.VERBOSe 文档。感谢那。我还发布了您要求的代码示例。错误显示在包含 `match = re.search(pattern, address) 的行上
-
@Tom Zych:谢谢,我把它放到代码中,我会用它来修改问题。
-
看起来模式中的某处有错误,可能缺少括号或其他什么?我劝你不要只是复制粘贴正则表达式,只会让人头疼……