You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

使用Python正则表达式提取DataFrame列中邮编后的荷兰城市名

从DataFrame地址列提取城市的正则解决方案

嘿,这就来帮你搞定这个正则提取的问题!先理清楚你的需求:要从格式类似[XXX_XXX_四位数字+两位字母 城市, XXX_XXX_四位数字+两位字母 城市]的字符串里,精准提取邮编(四位数字+两位字母)后面的城市名,城市截止到逗号,或者右方括号]之前对吧?

核心思路拆解

要实现这个提取,我们可以分两步定位目标内容:

  1. 先精准找到邮编的位置:四位数字 + 两位字母的格式,比如2805JD2855CJ
  2. 提取邮编之后、到逗号/右方括号之前的所有内容,这部分就是我们要的城市

最终正则表达式

直接给你能用的正则,我会逐部分解释:

(?<=\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']])

测试验证

用你提供的测试用例验证:

  1. 第一个测试用例会提取到:['GOUDA', 'Cappele aan de Ijsel']
  2. 第二个测试用例会提取到:['MAASBRACHT', 'MAASBRACHT']
  3. 第三个测试用例会提取到:['Laag Zuthm', 'Andelst-Jon Verkade_Nederland']

完全符合你的需求!

内容的提问来源于stack exchange,提问作者teller.py3

火山引擎 最新活动