为什么re.search无法匹配到文档中以'>'开头的行?
代码无法提取目标行的核心问题及修复方案
错误点梳理
- 无文件遍历逻辑,变量未定义:代码仅完成了输入、输出文件的打开操作,没有逐行读取文件的循环逻辑,用于匹配的
line变量未定义,运行时会直接触发NameError,无法执行匹配逻辑。 - 正则规则和匹配目标不匹配:你需要匹配的是文本中的原生
>字符,但正则中写了HTML转义实体>,只有当文件内容本身存储的是转义后的HTML代码时才会命中,普通文本中的>完全无法匹配。 - 无捕获组却调用分组索引:你编写的正则没有用括号定义任何捕获分组,即便匹配成功,调用
group(1)也会触发IndexError,如果需要获取整个匹配结果,应该调用group(0),如果需要提取>后的特定内容,需要用括号包裹对应匹配规则。 - 缺少文件写入逻辑、资源未释放:代码打开输出文件后没有写入操作,匹配结果仅打印在终端,且运行结束后没有关闭输入、输出文件句柄,会造成资源泄漏。
修正后代码
如果你的需求是提取行首>后第一个非空白字符串,可使用以下代码,通过with上下文管理器自动处理文件关闭,适配大型文档处理:
import sys import re with open(sys.argv[1], 'r', encoding='utf-8') as input_f, open(f"{sys.argv[1]}.summary", 'w', encoding='utf-8') as output_f: for line in input_f: match_obj = re.match(r'>\s(\S+)', line) if match_obj: hit = match_obj.group(1) print(hit) output_f.write(hit + '\n')
如果仅需要提取所有以>开头的完整行,不需要正则匹配,直接用字符串前缀判断性能更高,更适合大文件:
import sys with open(sys.argv[1], 'r', encoding='utf-8') as input_f, open(f"{sys.argv[1]}.summary", 'w', encoding='utf-8') as output_f: for line in input_f: if line.startswith('>'): print(line, end='') output_f.write(line)
内容的提问来源于stack exchange,提问作者mwjones
相关产品推荐
相关产品推荐

