正则表达式拆分格式不正确的地址

Regex Splitting Incorrectly Formatted Addresses

我正在 尝试更正地址数据,其中附加的街道地址和 city/town 信息没有 space

识别分割点的最简单方法是查找道路类型(例如 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,})

它处理 Street、Lane、Drive、Avenue、Boulevard、Highway,并根据 EPA 的 TSCA 数据在主要方向上进行拆分。

您可以使用模式:

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

解释:

(...) - 捕获组

- maatch space 字面意思

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

STREET - 按字面意思匹配 STREET

ST - 按字面意思匹配 ST

| - 交替运算符

(?=...) - 正面前瞻断言

[A-Z] - 字符 class - 匹配范围 A-Z 中的字符,因此任何大写英文字符

替换模式为 ,因此首先捕获组(STSTREET),然后是 space。

Regex demo

(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 only

(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