使用Power Query从非结构化地址字段提取5位邮政编码
问题背景
我有一列混杂了街道名、门牌号、城市和邮政编码的地址数据,需要从中精准提取出唯一的5位数字邮编。手头的地址示例如下:
SAINT REIMS 21 RUE DU MOULIN FLORE 51421 NEULLY LS REIMS
ALLEE DES AIGUERELLES 5 MONTPELLIER 01480
RUE DE CAMILLE FLORIENT 123 PARIS 25123
MOTPELLIER, ZAC DES EMPRENEURS 34123 SAINT JEAN DE VEDAS
AVENIDA DE LOS OLMOS S/N POLIGONO GRANDE 42523 PUERTO DE SAGUNTO
C/MAYOR 2321, MARBELLA, MALAGA
(翻译后的中文示例:)
兰斯圣区 21 磨坊花街 51421 讷伊莱斯兰斯
艾盖雷勒巷 5 蒙彼利埃 01480
卡米尔·弗洛里安街 123 巴黎 25123
蒙彼利埃,创业者开发区 34123 圣让德韦达
奥尔莫斯大道 S/N 大园区 42523 萨贡托港
市长街 2321,马贝拉,马拉加
解决方案
最靠谱的方式是用正则表达式匹配5位连续数字——毕竟门牌号基本都是1-4位,不会和5位邮编搞混。下面是不同场景下的实现方法:
Excel/谷歌表格
直接用REGEXEXTRACT函数,公式写在目标单元格里:
=REGEXEXTRACT(A1,"\b\d{5}\b")
\b是单词边界,保证提取的是完整的5位数字,不会是更长数字的一部分;\d{5}就是匹配连续5位数字。
Python
用内置的re模块就行,代码示例:
import re # 示例地址列表 address_list = [ "SAINT REIMS 21 RUE DU MOULIN FLORE 51421 NEULLY LS REIMS", "ALLEE DES AIGUERELLES 5 MONTPELLIER 01480", "RUE DE CAMILLE FLORIENT 123 PARIS 25123", "MOTPELLIER, ZAC DES EMPRENEURS 34123 SAINT JEAN DE VEDAS", "AVENIDA DE LOS OLMOS S/N POLIGONO GRANDE 42523 PUERTO DE SAGUNTO", "C/MAYOR 2321, MARBELLA, MALAGA" ] # 遍历提取邮编 for addr in address_list: match = re.search(r'\b\d{5}\b', addr) print(match.group() if match else "无有效邮编")
运行后会逐个输出每个地址的邮编,最后那个没5位邮编的会显示“无有效邮编”。
SQL(以MySQL为例)
用REGEXP_SUBSTR函数提取:
SELECT REGEXP_SUBSTR(address_column, '[0-9]{5}') AS zip_code FROM your_table_name;
要是怕匹配到更长数字里的片段,就把正则改成'\\b[0-9]{5}\\b'(MySQL里要转义\b)。
补充说明
- 如果你的地址里邮编基本都在末尾,也可以用
'\d{5}$'这个正则,专门匹配结尾的5位数字,精准度更高。 - 遇到没有5位邮编的地址,记得提前处理空值情况,避免报错。
内容的提问来源于stack exchange,提问作者Amilcar

