You need to enable JavaScript to run this app. 如何基于关键词列表循环生成正则表达式从地址中提取道路名称
优惠活动
大模型
产品
解决方案
定价
更多

如何基于关键词列表循环生成正则表达式从地址中提取道路名称

问题诊断

你的现有代码无法生效的核心原因有3个:

  • 循环中重复给df['street']赋值,每次都会覆盖上一轮的匹配结果,最终只能保留最后一个关键词road的匹配结果,street、avenue匹配到的内容会被全部覆盖
  • 正则表达式直接把变量i写在字符串里,Python不会自动解析变量的实际值,相当于你每次匹配的都是字符i本身
  • 正则规则本身不符合需求:开头加\d强制要求匹配数字,你的示例地址中Oxford前没有数字,必然匹配失败,同时正则语法不完整缺少右括号

最优实现方案

不需要写循环,直接把关键词拼接成正则的或逻辑即可,性能更高,写法更简洁:

import pandas as pd
import re

keywords = ['street','avenue','road']
# 构造正则规则:匹配道路名+关键词的组合,适配你逗号分隔的地址格式,忽略大小写
pattern = rf'([a-zA-Z -]+(?:{"|".join(keywords)}))'
# 提取结果并去除前后多余空格
df['street'] = df['address'].str.extract(pattern, flags=re.IGNORECASE)[0].str.strip()

用你提供的示例地址UK, Manchester, Oxford road, 57测试,最终df['street']的输出结果就是Oxford road,符合预期。

循环逻辑实现方案(如果你坚持要用循环思路完成)

如果一定要用循环的写法,可参考如下实现,避免覆盖问题:

import pandas as pd
import re

keywords = ['street','avenue','road']
# 先初始化street列为空值
df['street'] = ''
for kw in keywords:
    # 仅给还未匹配到道路名的行做当前关键词的匹配
    empty_mask = df['street'] == ''
    df.loc[empty_mask, 'street'] = df.loc[empty_mask, 'address'].str.extract(rf'([a-zA-Z -]+{kw})', flags=re.IGNORECASE)[0].str.strip()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.12 18:30:05