Python正则提取文本speed值报NoneType下标错误的解决方法
报错原因
两个问题共同导致报错:
- 正则规则编写错误。你给出的示例数据里
speed属性值是被双引号包裹的,格式为speed="24.87",但你写的匹配规则r'speed=([\d.]+)'要求speed=后面直接跟数字或小数点,没有考虑中间的双引号,哪怕是格式正确的vehicle行也会匹配失败,返回None。 - 缺少匹配结果判空逻辑。fcd.xml是SUMO输出的标准XML文件,里面除了vehicle标签行,还会包含XML声明、根标签、
<timestep>时间步标签、空行等内容,这些行本身没有speed字段,正则匹配时同样会返回None。你直接对返回值取下标[1],相当于对None做索引操作,自然会抛出TypeError: 'NoneType' object is not subscriptable错误。
修复方法
先修正正则规则,适配属性值的双引号格式,同时增加匹配结果的非空判断,确认匹配成功再取值。修正后的代码如下:
import re with open('fcd.xml', 'r', encoding='utf-8') as f: # 修正正则,匹配双引号包裹的speed数值 pattern = r'speed="([\d.]+)"' for line in f: match_result = re.search(pattern, line) if match_result: # 需要做数值计算可以转float,只需要字符串直接取group(1)即可 speed = float(match_result.group(1)) print(speed)
如果遇到属性值用单引号、或者等号两边有空格的不规范写法,可以把正则换成兼容性更高的版本:r'speed\s*=\s*["\']([\d.]+)["\']'。
如果要处理的是完全标准的XML文件,更推荐用XML解析库(比如Python自带的xml.etree.ElementTree)做结构化提取,比正则的容错性更强,不会因为标签格式的微小变动匹配失败。
内容的提问来源于stack exchange,提问作者kostas
相关产品推荐
相关产品推荐

