#!/usr/bin/env python3 # -*- coding: utf-8 -*- import re import json from datetime import datetime # 读取mock文件 with open('src/mocks/resumeInterviewMock.js', 'r', encoding='utf-8') as f: content = f.read() # 备份原文件 backup_time = datetime.now().strftime('%Y%m%d_%H%M%S') with open(f'src/mocks/resumeInterviewMock.js.backup_merge_{backup_time}', 'w', encoding='utf-8') as f: f.write(content) print(f"已创建备份文件: src/mocks/resumeInterviewMock.js.backup_merge_{backup_time}") def merge_questions_in_industry(industry_data): """将一个岗位群的多个questions组合并成一个""" # 找到questions数组的起始和结束位置 questions_start = industry_data.find('"questions": [') if questions_start == -1: return industry_data questions_start += len('"questions": [') # 找到questions数组的结束 bracket_count = 1 i = questions_start in_string = False escape_next = False while i < len(industry_data) and bracket_count > 0: char = industry_data[i] if escape_next: escape_next = False elif char == '\\': escape_next = True elif char == '"' and not escape_next: in_string = not in_string elif not in_string: if char == '[': bracket_count += 1 elif char == ']': bracket_count -= 1 i += 1 if bracket_count != 0: return industry_data questions_end = i - 1 questions_content = industry_data[questions_start:questions_end] # 解析questions数组内容 # 提取所有subQuestions all_sub_questions = [] question_counter = 1 # 查找所有的subQuestions pattern = r'"subQuestions":\s*\[(.*?)\](?:\s*}\s*]|\s*}\s*,)' matches = re.finditer(pattern, questions_content, re.DOTALL) for match in matches: sub_questions_str = match.group(1) # 解析每个子问题 sub_pattern = r'"question":\s*"([^"\\]*(?:\\.[^"\\]*)*)",\s*"answer":\s*"([^"\\]*(?:\\.[^"\\]*)*)"' sub_matches = re.finditer(sub_pattern, sub_questions_str) for sub_match in sub_matches: question_text = sub_match.group(1) answer_text = sub_match.group(2) # 处理答案格式 # 1. 如果是选择题答案(如 "A" 或 "B" 等单个字母),保持原样 # 2. 其他答案需要处理换行 if len(answer_text.strip()) == 1 and answer_text.strip() in 'ABCDEFGH': # 选择题答案,保持原样 formatted_answer = answer_text else: # 处理换行符,确保正确显示 formatted_answer = answer_text.replace('\\n', '
') # 如果答案包含选项(A. B. C. 等),只保留文字说明 if re.search(r'\s*[A-H]\.\s*', formatted_answer): # 移除选项标识,保留内容 formatted_answer = re.sub(r'\s*[A-H]\.\s*', '', formatted_answer) all_sub_questions.append({ 'id': f'q_{question_counter}', 'question': question_text, 'answer': formatted_answer }) question_counter += 1 # 构建新的questions数组(只包含一个大的question对象) merged_question = { 'id': 'merged_questions', 'question': '综合面试题集', 'subQuestions': all_sub_questions } # 生成新的questions数组字符串 new_questions_str = '\n {\n' new_questions_str += ' "id": "merged_questions",\n' new_questions_str += ' "question": "综合面试题集",\n' new_questions_str += ' "subQuestions": [\n' for idx, q in enumerate(all_sub_questions): question_escaped = q['question'].replace('"', '\\"') answer_escaped = q['answer'].replace('"', '\\"') new_questions_str += ' {\n' new_questions_str += f' "id": "{q["id"]}",\n' new_questions_str += f' "question": "{question_escaped}",\n' new_questions_str += f' "answer": "{answer_escaped}"\n' new_questions_str += ' }' if idx < len(all_sub_questions) - 1: new_questions_str += ',' new_questions_str += '\n' new_questions_str += ' ]\n' new_questions_str += ' }\n ' # 替换原来的questions数组内容 before_questions = industry_data[:questions_start] after_questions = industry_data[questions_end:] return before_questions + new_questions_str + after_questions # 处理每个岗位群 industries_pattern = r'(\{\s*"id":\s*"manufacturing_\d+".*?"questions":\s*\[.*?\]\s*\})' def replace_industry(match): industry_data = match.group(1) return merge_questions_in_industry(industry_data) # 分段处理以避免递归深度问题 lines = content.split('\n') in_industry = False industry_lines = [] result_lines = [] industry_start = -1 for i, line in enumerate(lines): if '"id": "manufacturing_' in line and not in_industry: in_industry = True industry_start = i industry_lines = [line] elif in_industry: industry_lines.append(line) # 检查是否是industry的结束 if ' },' in line or ' }' in line: # 如果下一行是positions或questions,说明还没结束 if i + 1 < len(lines): next_line = lines[i + 1] if '"positions":' in next_line or '"questions":' in next_line: continue # 处理这个industry industry_text = '\n'.join(industry_lines) processed_industry = merge_questions_in_industry(industry_text) # 将处理后的内容添加到结果 result_lines.extend(processed_industry.split('\n')) in_industry = False industry_lines = [] else: result_lines.append(line) # 如果最后还有未处理的industry if industry_lines: industry_text = '\n'.join(industry_lines) processed_industry = merge_questions_in_industry(industry_text) result_lines.extend(processed_industry.split('\n')) # 合并结果 final_content = '\n'.join(result_lines) # 保存处理后的文件 with open('src/mocks/resumeInterviewMock.js', 'w', encoding='utf-8') as f: f.write(final_content) print("✅ 面试题合并完成!") print("- 所有题目已合并到同一张卡片") print("- 答案换行已转换为
标签") print("- 选择题答案已处理为只显示正确答案")