You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过正则匹配从Pandas DataFrame中提取目标城市名称

没问题,我来帮你搞定这个从Pandas地址列提取城市名的需求!要准确抓出逗号后、固定国家名前的城市(包括多词城市),我们可以用两种思路实现,兼顾不同场景:

方法一:字符串分割法(简单直接)

先明确我们要排除的国家列表,然后一步步拆分地址字符串:

import pandas as pd

# 先创建示例DataFrame(你可以替换成自己的数据源)
data = {'address': [
    '10 rue des Treuils BP 12 33023, Bordeaux France',
    '45 Avenue de la République, Les Deux Alpes France',
    'Via Roma 123, Val dIsere Italy',
    'Musterstraße 45, Munich Germany'
]}
df = pd.DataFrame(data)

# 定义需要排除的国家列表,可根据你的需求随时扩展
country_list = ['France', 'Italy', 'Germany']

# 核心提取逻辑
df['city'] = df['address'].str.split(',', expand=True)[1] \
                          .str.split('|'.join(country_list), expand=True)[0] \
                          .str.strip()

# 查看结果
print(df[['address', 'city']])

运行后会得到:

address            city
0        10 rue des Treuils BP 12 33023, Bordeaux France        Bordeaux
1  45 Avenue de la République, Les Deux Alpes France  Les Deux Alpes
2                  Via Roma 123, Val dIsere Italy       Val dIsere
3                    Musterstraße 45, Munich Germany          Munich

方法二:正则提取法(更灵活,支持大小写)

如果你的地址里国家名可能有大小写混合(比如france小写),用正则会更稳妥:

import pandas as pd
import re

df = pd.DataFrame(data)  # 沿用上面的示例数据
country_list = ['France', 'Italy', 'Germany']

# 构建正则模式:匹配逗号后、国家名前的所有内容(非贪婪匹配)
pattern = rf',\s*(.*?)\s*(?:{"|".join(country_list)})$'

# 提取城市名,flags=re.IGNORECASE忽略大小写
df['city'] = df['address'].str.extract(pattern, flags=re.IGNORECASE)[0]

这个正则的逻辑拆解:

  • ,\s*:匹配地址里的逗号,以及后面跟着的任意空格
  • (.*?):非贪婪捕获组,精准抓取逗号后到国家名前的所有内容(完美适配多词城市)
  • \s*(?:...):匹配国家名前的空格,(?:...)是非捕获组,不会把国家名也提取出来
  • $:确保匹配到地址的结尾,避免误抓其他内容

两种方法都能满足你的需求,要是地址格式有特殊情况,调整国家列表或者正则模式就可以啦~

内容的提问来源于stack exchange,提问作者user1411335

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 07:27:29