正则表达式拆分格式不正确的地址
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
中的字符,因此任何大写英文字符
替换模式为
,因此首先捕获组(ST
或 STREET
),然后是 space。
(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,})
其他可能的选择:
1.) 仅当 REET 后面没有单词边界时才匹配 ST 并可选地匹配 REET:
\bST(?!REET\b)(?:REET)?
2.) 使用正则表达式 PyPy module 使用可选的非捕获组和所有格量词后跟非单词边界:
\bST(?:REET)?+\B
我正在 尝试更正地址数据,其中附加的街道地址和 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
中的字符,因此任何大写英文字符
替换模式为
,因此首先捕获组(ST
或 STREET
),然后是 space。
(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,})
其他可能的选择:
1.) 仅当 REET 后面没有单词边界时才匹配 ST 并可选地匹配 REET:
\bST(?!REET\b)(?:REET)?
2.) 使用正则表达式 PyPy module 使用可选的非捕获组和所有格量词后跟非单词边界:
\bST(?:REET)?+\B