Python处理itemsList.txt时re.group()返回None引发TypeError的问询
解决正则匹配时
group()返回None导致的TypeError问题 问题根源
你的正则表达式分组设计存在逻辑漏洞:当匹配到str "xxx"这类内容时,group(3)对应的是id分支下的捕获组,此时这个分组根本没有匹配到有效内容,自然返回None,而你直接将其拼接到字符串里就触发了TypeError。
拆解你的正则(id\s)(\"(.*)\")|(str\s)(\"(.*)\"),它分成两个独立分支:
- 第一个分支匹配
id "xxx",对应分组1、2、3(分组3是引号内的内容) - 第二个分支匹配
str "xxx",对应分组4、5、6(分组6是引号内的内容)
所以当匹配到str开头的片段时,group(3)必然是None,直接拼接就会报错。
修正方案
我们可以调整正则逻辑,让两个分支的目标内容统一到同一个捕获组,同时优化文件读取的写法:
import re # 用with语句自动管理文件生命周期,避免遗漏关闭操作 with open('itemsList.txt', encoding="utf8") as itemList: items = '' # 调整正则:用非捕获组匹配id/str,统一捕获引号内内容到分组1 pattern = re.compile(r'(?:id|str)\s+"(.*?)"', re.IGNORECASE) # 读取整个文件内容(你的目标内容可能在同一行) content = itemList.read() # 一次性获取所有匹配的引号内内容 matched_contents = pattern.findall(content) # 拼接结果,每个内容后换行 items = '\n'.join(matched_contents) + '\n' print(items)
代码细节解释
with语句操作文件:自动处理文件的打开与关闭,比手动调用close()更安全可靠。- 正则表达式优化:
(?:id|str)是非捕获组,仅用来匹配id或str但不保留该部分的捕获结果\s+匹配一个或多个空格,兼容内容里可能的多空格情况"匹配引号边界(.*?)是非贪婪捕获组,精准捕获引号内的内容(避免因贪婪匹配导致的跨引号错误)
findall批量匹配:直接提取所有符合规则的内容,无需逐行判断,效率更高且逻辑更简洁。
内容的提问来源于stack exchange,提问作者MaxDev
相关产品推荐
相关产品推荐

