如何基于关键词列表循环生成正则表达式从地址中提取道路名称
问题诊断
你的现有代码无法生效的核心原因有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
相关产品推荐
相关产品推荐

