Python从非一致格式字符串提取年份出现'NoneType'无group属性报错咨询
报错原因
- 触发
AttributeError是因为re.search()未匹配到符合规则的内容时会返回None,直接调用.group()方法就会报错。 - 部分行存入
re.Match对象,是因为代码执行过程中存在未调用.group()就直接把匹配结果赋值的情况。
修复方案
方案1:调整原有for循环逻辑
增加匹配结果判断,避免直接对None调用方法:
import re # 正则规则优化:匹配19/20开头的4位年份,加单词边界避免误匹配其他4位数字 pattern1 = r'\b(19|20)\d{2}\b' # 不要硬编码行数,用len(data)适配任意数据长度 for row in range(len(data)): fact_text = data.iat[row, index_fact] match_result = re.search(pattern1, fact_text) # 仅匹配成功时提取内容 if match_result: data.iat[row, index_year] = match_result.group() else: data.iat[row, index_year] = None
方案2(更推荐):使用pandas原生矢量化方法实现
pandas提供的str.extract方法专门用于从字符串列中提取正则匹配内容,无需手动写循环,匹配失败自动返回NaN,不会触发报错:
# 正则外层括号为捕获组,extract会直接返回该组匹配到的内容 year_pattern = r'\b((?:19|20)\d{2})\b' data['Year'] = data['Fact'].str.extract(year_pattern)
正则说明:
\b表示单词边界,避免误匹配长数字中的连续4位;(?:19|20)匹配年份开头的19或20(可根据你的数据范围调整),后接两位数字,适配绝大多数常用年份格式。
内容的提问来源于stack exchange,提问作者Grace_radetsk
相关产品推荐
相关产品推荐

