You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python提取文本中MSG、S/F后接数字内容并导出到文件问题咨询

需求说明

你需要对txt类文本文件做内容筛选,按搜索顺序输出符合以下规则的内容到新文件:

  • 匹配到字符串MSG的行,输出整行完整内容
  • 匹配仅后缀为数字的字母S的内容(即S+数字格式)
  • 匹配仅后缀为数字的字母F的内容(即F+数字格式)
原代码错误原因
  1. 正则表达式逻辑错误:使用Python逻辑运算符and拼接正则规则,并不会实现「匹配任意一类规则」的效果,等价于最终只执行了最后一个正则F\d+的匹配,完全不符合需求
  2. 匹配逻辑不合理:直接对整个文件内容做正则匹配,没有处理优先级(MSG行的内容不需要再拆分匹配S/F),也无法保证输出顺序完全符合原文的搜索顺序
  3. 缺少GUI主循环启动逻辑,窗口无法正常运行
修正后完整代码
#!/usr/bin/env  python
from tkinter.ttk import Combobox
from tkinter import ttk
from tkinter.filedialog import askopenfilename
import os
import re
import time
from pathlib import Path
from tkinter.filedialog import askopenfilenames
from tkinter import *

window=Tk()

var=IntVar()

def OpenFile():
    filename = askopenfilenames(initialdir="",
                                filetypes=(("Text File","*.txt"),("Text File","*.MPF"),("Text File","*.H"),("Text File","*"),("All Files","*.*")),
                                title = "Seleziona file") 
    for filename in filename:                            
        with open(filename, 'r', encoding='utf-8') as intxt:
            name = os.path.splitext(filename)[0]+'_.txt'
            with open(name, 'w', encoding='utf-8') as outtxt:
                name1 = Path(filename).stem
                outtxt.write("list: "+name1+"   "+ time.strftime("%d/%m/%Y"+"  %H:%M:%S"))
                outtxt.write('\n\n')
                res_list = []
                # 逐行处理保证顺序和优先级
                for line in intxt:
                    line_strip = line.strip()
                    if not line_strip:
                        continue
                    # 优先匹配MSG行,匹配到直接加整行
                    if 'MSG' in line_strip:
                        res_list.append(line_strip)
                        continue
                    # 匹配S+数字和F+数字
                    matches = re.findall(r'[SF]\d+', line_strip)
                    if matches:
                        # 同一行多个匹配结果用空格拼接,和示例输出一致
                        res_list.append(' '.join(matches))
                # 写入结果
                outtxt.write("\n".join(res_list))
                          
# 打开文件按钮
btn=Button(window, text="Apri", fg='black', command=OpenFile)
btn.place(x=100, y=100)

window.title('Estra')
window.geometry("300x300+10+10")
window.mainloop()
核心修改点说明
  • 新增逐行遍历逻辑,优先处理含MSG的行,避免MSG行内容被二次拆分匹配,同时保证输出顺序和原文搜索顺序完全一致
  • 修正匹配规则:用[SF]\d+匹配S/F加数字的格式,匹配到的同层多个结果用空格拼接,完全对齐示例输出要求
  • 新增文件读写的编码指定为utf-8,避免特殊字符读写报错
  • 新增window.mainloop()逻辑,保证GUI窗口正常启动运行

内容的提问来源于stack exchange,提问作者Angelo Bon

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 12:06:07