#!/usr/bin/env python3 from __future__ import annotations import argparse import re import time from pathlib import Path def parse_args() -> argparse.Namespace: parser = argparse.ArgumentParser(description="提取非取关UP的AI分析与分组建议") parser.add_argument( "--input-report", default="source/output/reports/up_analysis_full_auto.md", help="输入分析报告路径,默认: source/output/reports/up_analysis_full_auto.md", ) parser.add_argument( "--output-report", default="source/output/reports/up_keep_follow_only.md", help="输出保留关注报告路径,默认: source/output/reports/up_keep_follow_only.md", ) return parser.parse_args() def main() -> int: args = parse_args() src = Path(args.input_report) dst = Path(args.output_report) if not src.exists(): print(f"来源文件不存在: {src}") return 1 text = src.read_text(encoding="utf-8") pattern = r"^##\s+\d+\.\s+(.+?)\s+\(mid:\s*(\d+)\)\s*$" matches = list(re.finditer(pattern, text, re.MULTILINE)) items: list[tuple[str, str, str, str, str, str]] = [] for i, m in enumerate(matches): start = m.start() end = matches[i + 1].start() if i + 1 < len(matches) else len(text) section = text[start:end] name = m.group(1).strip() mid = m.group(2).strip() action_m = re.search(r"-\s*建议动作:\s*(.+)", section) action = action_m.group(1).strip() if action_m else "" # 反逻辑:没有"建议动作: 可以取关"就保留 if action == "可以取关": continue ai_m = re.search(r"###\s*AI分析\s*\n([\s\S]*?)(?=\n###\s|\Z)", section) ai_text = ai_m.group(1).strip() if ai_m else "" group_m = re.search(r"###\s*分组建议\s*\n([\s\S]*?)(?=\n###\s|\Z)", section) group_text = group_m.group(1).strip() if group_m else "" error_m = re.search(r"###\s*异常\s*\n([\s\S]*?)(?=\n###\s|\Z)", section) error_text = error_m.group(1).strip() if error_m else "" items.append((name, mid, ai_text, group_text, action, error_text)) # 按昵称首字母A-Z排序(同名时按mid升序) items.sort(key=lambda x: (x[0].casefold(), int(x[1]))) lines = [ "# 保留关注UP主分析与分组建议", "", f"- 生成时间: {time.strftime('%Y-%m-%d %H:%M:%S')}", f"- 来源文件: {src.name}", f"- 条目数: {len(items)}", "", ] for idx, (name, mid, ai_text, group_text, action, error_text) in enumerate(items, 1): lines.append(f"## {idx}. {name} (mid: {mid})") lines.append("") lines.append("### AI分析") lines.append("") lines.append(ai_text if ai_text else "(无)") lines.append("") lines.append("### 分组建议") lines.append("") lines.append(group_text if group_text else f"- 建议动作: {action if action else '(无)'}") lines.append("") if error_text: lines.append("### 异常") lines.append("") lines.append(error_text) lines.append("") dst.parent.mkdir(parents=True, exist_ok=True) dst.write_text("\n".join(lines), encoding="utf-8") print(f"已生成: {dst}") print(f"保留条目: {len(items)}") return 0 if __name__ == "__main__": raise SystemExit(main())