使用正则表达式清理地址数据中的空字段(含逗号空格)
处理地址字符串中的空字段(正则解决方案)
需求回顾
需要清理第三方地址服务返回的字符串,去除其中连续的空字段(以, 分隔的空内容),保留非空的地址行和末尾的city、county、postcode字段。
正则方案
1. 针对单个地址记录的替换
对于单个地址记录(如'addr line one, , , , city, county, postcode'),使用以下正则替换即可完成清理:
import re # 示例原始记录 original_record = 'addr line one, , , , city, county, postcode' cleaned_record = re.sub(r',\s*(?=,)', '', original_record)
- 正则逻辑:
,\s*:匹配逗号加任意数量空格(对应你的,分隔符)(?=,):正向预查,确保匹配的分隔符后紧跟另一个逗号(即定位连接空字段的无效分隔符)- 替换为空字符串后,自动保留非空字段间的有效分隔,得到目标格式。
2. 批量处理含多个记录的原始字符串
如果要直接处理包含多条记录的完整字符串,推荐先拆分再过滤的方案,比纯正则更直观可靠:
# 原始地址字符串(去掉首尾单引号) raw_str = "addr line one, , , , city, county, postcode, addr line one, addr line two, , , city, county, postcode, addr line one, , , , city, county, postcode, addr line one, addr line two, addr line three, addr line four, city, county, postcode" # 拆分所有字段,每7个字段为一条完整地址记录 fields = raw_str.split(', ') records = [fields[i:i+7] for i in range(0, len(fields), 7)] # 清理每条记录:过滤空字段后重新拼接 cleaned_records = [', '.join(filter(None, record)) for record in records] # 输出结果 for record in cleaned_records: print(f"'{record}'")
执行后输出完全符合需求:
'addr line one, city, county, postcode' 'addr line one, addr line two, city, county, postcode' 'addr line one, city, county, postcode' 'addr line one, addr line two, addr line three, addr line four, city, county, postcode'
纯正则批量处理(可选)
如果必须用单条正则处理整个字符串(依赖记录固定为7字段、后3字段非空的结构),可以使用:
cleaned_str = re.sub(r'((?:[^,]+, )+)(?:, )+([^,]+, [^,]+, [^,]+)', r'\1\2', raw_str)
但这种方式灵活性较差,仅适合结构完全固定的场景。
内容的提问来源于stack exchange,提问作者arresteddevelopment
相关产品推荐
相关产品推荐

