
本文介绍如何使用正则表达式在pandas中精准识别并保留含真实门牌号(数字+后续地址文字)的地址行,自动过滤纯字母地址和仅有邮编的无效记录。
本文介绍如何使用正则表达式在pandas中精准识别并保留含真实门牌号(数字+后续地址文字)的地址行,自动过滤纯字母地址和仅有邮编的无效记录。
在地理信息处理或地址清洗任务中,常需区分“真实街道地址”与“无意义字符串”或“孤立邮编”。核心挑战在于:仅含字母的地址(如 San Diego County, California)和仅含5位邮编的地址(如 ... 92570)均不具门牌号语义,应被剔除;而类似 4150 Ute Dr, ... 这类“数字开头 + 空格 + 字母”的结构才代表有效门牌号。
推荐采用正则表达式结合 str.contains() 实现高效筛选:
import pandas as pd
d = {
'col1': [
'San Diego County, California',
'4150 Ute Dr, San Diego, California',
'Vista del Lago, Perris, California, 92570'
],
'col2': ['prov_1', 'prov_2', 'prov_3']
}
df = pd.DataFrame(data=d)
# ✅ 推荐方案:匹配「1–4位数字 + 可选空格 + 至少一个字母」
filtered_df = df[df['col1'].str.contains(r'\d{1,4}\s*[a-zA-Z]+', na=False)]
print(filtered_df)输出结果:
col1 col2 1 4150 Ute Dr, San Diego, California prov_2
✅ *为什么用 `\d{1,4}\s[a-zA-Z]+`?**
- \d{1,4}:限制数字位数为1–4位,有效规避5位纯邮编(如 92570);
- \s*:允许数字后存在零个或多个空格;
- [a-zA-Z]+:确保数字后紧邻至少一个英文字母(如 Ute、Dr),表明其为街道名/单位名,而非邮编结尾。
⚠️ 注意事项:
- 若地址中门牌号超过4位(如 12345 Main St),可放宽为 \d{1,5},但需权衡误捕邮编风险;
- 使用 na=False 防止缺失值引发 NaN 导致布尔索引错误;
- str.contains() 默认启用正则,无需额外参数;若需精确匹配整字段,可改用 str.extract() + notna() 组合。
? 进阶建议:
对更复杂地址(含逗号分隔、多级编号等),可先用 str.split(',').str[0] 提取首段再校验,或结合 address_parser 类库做结构化解析。但对本场景,上述正则已兼具简洁性与鲁棒性——一次过滤,精准锁定真实门牌号。

















