如何修改pandas df列str.extract所用regex以正确提取地址地块信息
pandas提取地址中地块Lot编号的正则修正方案
问题场景
DataFrame的Addr列存储标准地址文本,需要提取地址开头标注的地块编号生成独立Lot列,样例数据如下:
df['Addr'] LT 75 CEDAR WOOD 3RD PL LTS 22,25 & 26 MULLINS CORNER LTS 7 & 8 PT LT 22-23 JEFFERSON HIGHLANDS EXTENSION
预期提取结果:
df['Lot'] 75 22,25 & 26 7 & 8 22-23
初始使用的提取代码如下,运行后逗号、&连接的多地块编号只能抓到第一个数字段,结果不符合要求:
df['Lot'] = df['Addr'].str.extract(r'\b(?:LOT|LT|LTS?) (\w+(?:-\d+)*)') # 实际输出 # 75 # 22 # 7 # 22-23
问题原因
初始正则的捕获组规则只覆盖了「纯数字」「数字-数字」两种单地块/连字符连接的连续地块格式,没有把逗号、&(含转义格式&)识别为地块编号的合法连接符,匹配到第一个数字后碰到逗号/&就直接终止,导致多地块内容截断。
修改方案
调整捕获组规则,将逗号、&、横杠都纳入编号连接符的匹配范围,匹配到第一个非编号相关的字符(也就是后续路名的首字母)时自动停止,修改后代码如下:
# 适配&转义为&的存储场景 df['Lot'] = df['Addr'].str.extract(r'\b(?:LOT|LT|LTS?) ((?:\d+[,&-]?\s*(?:&)?\s*)+)')
如果地址中存储的是原生&字符而非转义后的&,可以用更简洁的正则版本:
df['Lot'] = df['Addr'].str.extract(r'\b(?:LOT|LT|LTS?) ((?:\d+[,&-]?\s*&?\s*)+)')
运行上述代码后,样例数据的提取结果和预期完全一致。
内容的提问来源于stack exchange,提问作者amnesic
相关产品推荐
相关产品推荐

