如何使用Python正则提取DataFrame中'year'关键词前的数字
问题原因
你之前使用的正则\d{2}+(?=year)存在以下错误,无法得到正确结果:
- 硬编码限定只能匹配2位长度的数字,无法匹配示例中
1 year里的1位数字 {2}+属于非法的量词组合,Python标准正则引擎无法解析该写法- 没有兼容
year的复数形式years,也没考虑数字与关键词之间的空格、关键词后带冒号等实际场景。
实现方案
直接使用pandas字符串方法str.extract配合修正后的正则即可,正则逻辑为捕获紧邻year/years前的连续数字,自动忽略不匹配的行:
import pandas as pd # 测试数据 df = pd.DataFrame({ 'data': [ 'Membership 1 year', 'Individual - 10 years:', 'Membership 2019-2024' ] }) # 提取年限 df['contract_years'] = df['data'].str.extract(r'(\d+)\s*years?(?=[:\s]|$)')
执行后得到的结果与预期完全一致:
data contract_years 0 Membership 1 year 1 1 Individual - 10 years: 10 2 Membership 2019-2024 NaN
如果需要将结果转为整数类型(保留空值),可以追加类型转换:
df['contract_years'] = df['contract_years'].astype('Int64')
正则说明:
(\d+):捕获1位及以上的连续数字,即目标年限值\s*:匹配数字和关键词之间0到多个任意空白字符years?:同时兼容单数year和复数years两种写法(?=[:\s]|$):正向预查校验,确保关键词后是冒号、空白或字符串结尾,避免误匹配包含year的其他长单词。
内容的提问来源于stack exchange,提问作者Osca
相关产品推荐
相关产品推荐

