如何通过正则匹配从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
相关产品推荐
相关产品推荐

