如何将正则匹配结果存入变量并写入txt输出文件?
解决正则匹配最长聚谷氨酰胺链并写入文件的问题
你的核心问题是没有在遍历正则匹配结果时跟踪记录最长的那个匹配项,而且循环结束后m变量可能指向最后一个匹配(甚至无匹配时会是None),导致写入文件时拿到错误值。
修改步骤:
- 初始化变量存储最长匹配的起始位置、长度和序列,设置合理默认值
- 遍历所有匹配时,对比当前匹配长度与已记录的最长长度,更新最长匹配信息
- 写入文件时使用预存的变量,替代固定值和循环后的
m
修改后的完整代码:
student_name = "Doe" student_seq = "" # 用with语句自动管理文件,避免手动关闭的问题 with open("sequences/all_seq.tsv","r") as seqs: for l in seqs: # 注意:如果是TSV文件,建议用split("\t")替代split(" "),避免空格分割出错 fields = l.strip().split(" ") if len(fields) >= 2 and fields[0] == student_name: student_seq = fields[1] import re # 初始化最长匹配的变量 max_start = 0 max_length = 0 max_seq = "" # 匹配连续的CAA/CAG重复 pattern = re.compile("(CAA|CAG)+") for m in re.finditer(pattern, student_seq): current_length = len(m.group(0)) # 如果当前匹配更长,更新最长匹配的信息 if current_length > max_length: max_length = current_length max_start = m.start(0) max_seq = m.group(0) # 可选:打印所有匹配,方便调试 print(m.start(0), current_length, m.group(0)) # 写入结果到文件,同样用with语句 with open("polyq.txt","w") as out_handle: out_handle.write( f"My name is {student_name} and my sequence is {student_seq}\n" f"The longest polyglutamine tract start position is {max_start}.\n" f"The DNA length of longest polyglutamine tract is {max_length}.\n" f"The sequence for longest polyglutamine tract is {max_seq}\n" )
关键说明:
- 用
with语句处理文件:自动管理文件的打开和关闭,避免资源泄漏 - 跟踪最长匹配:循环中实时对比匹配长度,确保最终拿到的是真正最长的片段
- f-string格式化:比字符串拼接更简洁易读,减少语法错误
- 边界处理:读取行时用
strip()去除首尾空白,判断fields长度避免索引越界
内容的提问来源于stack exchange,提问作者Doe
相关产品推荐
相关产品推荐

