使用Python正则表达式提取DataFrame列中邮编后的荷兰城市名
从DataFrame地址列提取城市的正则解决方案
嘿,这就来帮你搞定这个正则提取的问题!先理清楚你的需求:要从格式类似[XXX_XXX_四位数字+两位字母 城市, XXX_XXX_四位数字+两位字母 城市]的字符串里,精准提取邮编(四位数字+两位字母)后面的城市名,城市截止到逗号,或者右方括号]之前对吧?
核心思路拆解
要实现这个提取,我们可以分两步定位目标内容:
- 先精准找到邮编的位置:四位数字 + 两位字母的格式,比如
2805JD、2855CJ - 提取邮编之后、到逗号/右方括号之前的所有内容,这部分就是我们要的城市
最终正则表达式
直接给你能用的正则,我会逐部分解释:
(?<=\d{4}[A-Z]{2})\s+(.*?)(?=,|\])
正则各部分详解
(?<=\d{4}[A-Z]{2}):正向回顾后发断言,确保我们要匹配的内容前面是「四位数字+两位大写字母」的邮编,不会把邮编本身包含到结果里\s+:匹配邮编和城市之间的一个或多个空格(处理可能的空格差异)(.*?):非贪婪捕获组,匹配任意字符(除换行),?是关键——避免一次性匹配到最后一个逗号/右方括号,确保每个邮编对应一个城市(?=,|\]):正向预查断言,确保匹配到的内容后面是逗号或者右方括号,精准终止城市内容的提取
如果你的邮编可能出现小写字母,加上re.IGNORECASE标志即可,正则不用改。
Python结合DataFrame的实战用法
假设你的DataFrame列名叫address_col,用下面的代码就能批量提取每个单元格里的所有城市:
import pandas as pd import re # 示例DataFrame(替换成你的真实数据) df = pd.DataFrame({ 'address': [ "[Jon Doe_Sesamstreet 10_2805JD GOUDA, DENNIS PEPERSTRAATE_Regentesseplantsoen 56_2855CJ Cappele aan de Ijsel]", "[A. Smith_Broekstraat 99-A_4032JZ MAASBRACHT, A. GOEDBLOED 72_9332KL MAASBRACHT]", "[T. Loyal_Da Smeet 6_3381AZ Laag Zuthm, T. OppersACSI (Ton)_Loyal 99_6688DR Andelst-Jon Verkade_Nederland]" ] }) # 正则表达式 city_pattern = r'(?<=\d{4}[A-Z]{2})\s+(.*?)(?=,|\])' # 提取每个单元格中的所有城市,生成列表列 df['extracted_cities'] = df['address'].apply( lambda x: re.findall(city_pattern, x, re.IGNORECASE) ) # 查看结果 print(df[['address', 'extracted_cities']])
测试验证
用你提供的测试用例验证:
- 第一个测试用例会提取到:
['GOUDA', 'Cappele aan de Ijsel'] - 第二个测试用例会提取到:
['MAASBRACHT', 'MAASBRACHT'] - 第三个测试用例会提取到:
['Laag Zuthm', 'Andelst-Jon Verkade_Nederland']
完全符合你的需求!
内容的提问来源于stack exchange,提问作者teller.py3




