【问题标题】:Regex Splitting Incorrectly Formatted Addresses正则表达式拆分格式不正确的地址
【发布时间】:2021-12-20 15:38:13
【问题描述】:

我正在尝试更正地址数据,其中街道地址和城市/城镇信息被附加而没有空格

识别分割点的最简单方法是查找道路类型(例如 STREET、ST.),后跟一个单词,例如:

1201 WEST FRONT STREETCHESTER PA 19013-3496

但是,在其他单词(例如 SOUTH)上会出现一些拆分。我们暂时不需要检测这些。

703 6TH STREET SOUTHTEXAS CITY TX 77590

以下正则表达式,

(ST(?:REET)?)\.?([A-Z]{3,})

适用于大多数示例,但在第二个示例中将匹配 ST REET。 IIRC 正则表达式默认是贪婪的,所以我不明白为什么会这样。我的理解是第一个捕获组应该防止第二个捕获组触发。我尝试将正则表达式重写为(STREET|ST)\.?([A-Z]{3,}),但这并没有改变任何东西。

是否有任何方法可以帮助重写正则表达式或编译标志?


解决方案

对于那些感兴趣的人,使用 Michal 的正则表达式作为起点,我使用的最终正则表达式是:

\s((?:(?!STREET|STATE)ST|STREET|LANE|LN|(?!DRIVE)DR|DRIVE|ROAD|RD|[0-9]+|(?!AVENUE)AVE|AVENUE|BOULEVARD|BLVD|HWY|HIGHWAY|WEST|EAST|(?!NORTHEAST|NORTHWEST)NORTH|(?!SOUTHEAST|SOUTHWEST)SOUTH|N\.|S\.|W\.|E\.)\.?)(?=[A-Z]{3,})

它为 EPA 的 TSCA 数据处理街道、车道、车道、大道、林荫大道、高速公路和主要方向的拆分。

【问题讨论】:

    标签: python regex street-address


    【解决方案1】:

    你可以使用模式:

    ( (?!STREET)ST|STREET)(?=[A-Z])
    

    解释:

    (...) - 捕获组

    - 匹配空间

    (?!...) - 否定前瞻断言

    STREET - 匹配 STREET 字面意思

    ST - 匹配 ST 字面意思

    | - 交替运算符

    (?=...) - 积极的前瞻断言

    [A-Z] - 字符类 - 匹配范围 A-Z 中的字符,所以任何大写英文字符

    替换模式为\1 ,因此首先捕获组(STSTREET)后跟空格。

    Regex demo

    【讨论】:

    • 这成功了,谢谢 Michal!我从来没有听说过正则表达式中的前瞻和后瞻,所以这是一个救命稻草。
    【解决方案2】:

    (ST(?:REET)?)\.?([A-Z]{3,})(STREET|ST)\.?([A-Z]{3,}) 都匹配单个单词STREET 的原因是正则表达式必须匹配整个模式,并注意. 是可选的。

    由于点是可选的,正则表达式可以匹配STREET[A-Z]{3,}ST[A-Z]{3,}

    第一个模式不能只匹配单词 STREET,因为 STREET 后面应该有 3 个或更多字符,但第二个模式可以匹配 ST 和 3 个或更多字符....匹配 STREET。


    您可以做的是匹配 STREET 和 3 个或更多字符,或者匹配 ST。以及 3 个或更多字符与单词 STREET 不匹配

    (STREET|ST\.)([A-Z]{3,})
    

    Regex demo


    其他可能的选择:

    1.) 仅当 REET 后面没有单词边界时,才匹配 ST 和可选匹配 REET:

    \bST(?!REET\b)(?:REET)?

    Regex demo

    2.) 使用正则表达式PyPy module,使用可选的非捕获组和所有格量词,后跟非单词边界:

    \bST(?:REET)?+\B

    Regex demo

    【讨论】:

    • 感谢您的解释,现在事情变得更有意义了!一些例子的 ST 后面没有点,而另一些例子后面有一个点的街道,所以这种方法是行不通的。我最终使用了 Michal 答案的修改版本
    • @FelixLabelle 你也可以使用\bST(?!REET\b)(?:REET)?regex101.com/r/cGjnK0/1
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-10-14
    • 2020-03-06
    • 2016-02-22
    • 2012-11-05
    • 2013-08-11
    • 2021-12-04
    • 1970-01-01
    相关资源
    最近更新 更多