File size: 5,956 Bytes
a705843
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
"""
优化的 GDL 和自然语言提取函数
可以直接复制到 app.py 中使用
"""
import re


def extract_gdl_and_narrative(content):
    """
    提取 GDL 和自然语言部分(优化版 - 平衡功能与复杂度)
    
    支持的格式:
    - ## GDL描述 / ## GDL 描述
    - ##GDL描述 / GDL描述
    - ## 自然语言规则说明 / ##自然语言规则说明
    - 以及其他常见变体
    
    Args:
        content: AI 生成的完整文本
        
    Returns:
        tuple: (gdl_content, narrative_content)
    """
    
    # ========== 定义标记模式(按优先级排序) ==========
    gdl_patterns = [
        r"##\s*GDL\s*描述",          # ## GDL描述 或 ## GDL 描述(推荐格式)
        r"##\s*GDL描述",              # ##GDL描述
        r"GDL\s*描述",                # GDL描述 或 GDL 描述
        r"##\s*GDL\s*Description",    # ## GDL Description(英文)
        r"##\s*GDL",                  # ## GDL(简化版)
    ]
    
    narrative_patterns = [
        r"##\s*自然语言规则说明",      # ## 自然语言规则说明(推荐格式)
        r"##\s*自然语言规则",          # ## 自然语言规则
        r"自然语言规则说明",            # 自然语言规则说明
        r"自然语言规则",                # 自然语言规则
        r"##\s*Natural\s*Language",   # ## Natural Language(英文)
        r"规则说明",                    # 规则说明(简化版)
    ]
    
    # ========== 查找标记位置 ==========
    gdl_start = -1
    gdl_marker = None
    for pattern in gdl_patterns:
        match = re.search(pattern, content, re.IGNORECASE)
        if match:
            gdl_start = match.start()
            gdl_marker = match.group()
            break
    
    narrative_start = -1
    narrative_marker = None
    for pattern in narrative_patterns:
        match = re.search(pattern, content, re.IGNORECASE)
        if match:
            narrative_start = match.start()
            narrative_marker = match.group()
            break
    
    # ========== 处理提取结果 ==========
    if gdl_start != -1 and narrative_start != -1:
        # 正常情况:两个标记都找到
        
        # 检查顺序(GDL 应该在自然语言之前)
        if gdl_start >= narrative_start:
            print(f"⚠️ 警告: 标记顺序异常,已自动纠正")
            gdl_start, narrative_start = narrative_start, gdl_start
        
        # 提取内容
        gdl_content = content[gdl_start:narrative_start].strip()
        narrative_content = content[narrative_start:].strip()
        
        # 验证长度
        if len(gdl_content) < 20 or len(narrative_content) < 20:
            print(f"⚠️ 警告: 提取内容过短 (GDL:{len(gdl_content)}, 自然语言:{len(narrative_content)})")
        
        print(f"✅ 提取成功: GDL({len(gdl_content)}字符), 自然语言({len(narrative_content)}字符)")
        return gdl_content, narrative_content
    
    elif gdl_start != -1:
        # 只找到 GDL 标记
        print(f"⚠️ 仅找到GDL标记 '{gdl_marker}',将其后全部内容作为GDL")
        gdl_content = content[gdl_start:].strip()
        return gdl_content, ""
    
    elif narrative_start != -1:
        # 只找到自然语言标记
        print(f"⚠️ 仅找到自然语言标记 '{narrative_marker}',将其后全部内容作为自然语言")
        narrative_content = content[narrative_start:].strip()
        return "", narrative_content
    
    else:
        # 都没找到:尝试智能分割
        print(f"❌ 未找到任何标记,尝试智能分割...")
        return smart_split_content(content)


def smart_split_content(content):
    """
    智能分割内容(后备方案)
    
    策略:通过识别 GDL 代码特征(如 (game "..." )来分割
    """
    # 查找 GDL 代码块的起始标志
    gdl_code_pattern = r'\(game\s+"[^"]+?"'
    match = re.search(gdl_code_pattern, content)
    
    if match:
        gdl_start = match.start()
        
        # 简单的括号匹配查找结束位置
        count = 0
        gdl_end = -1
        for i in range(gdl_start, len(content)):
            if content[i] == '(':
                count += 1
            elif content[i] == ')':
                count -= 1
                if count == 0:
                    gdl_end = i
                    break
        
        if gdl_end != -1:
            gdl_content = content[gdl_start:gdl_end + 1].strip()
            narrative_content = content[gdl_end + 1:].strip()
            print(f"🔍 智能分割成功: 识别到GDL代码块")
            return gdl_content, narrative_content
    
    print(f"❌ 智能分割失败")
    return "", ""


# ========== 测试代码 ==========
if __name__ == "__main__":
    # 测试用例
    test_cases = [
        # 测试 1: 标准格式
        """
## 游戏名称
测试游戏

## GDL描述
(game "TestGame"
  (players 3)
)

## 自然语言规则说明
1. 这是规则
""",
        # 测试 2: 无空格格式
        """
##GDL描述
(game "TestGame"
  (players 3)
)

##自然语言规则说明
1. 这是规则
""",
        # 测试 3: 带空格格式
        """
## GDL 描述
(game "TestGame"
  (players 3)
)

## 自然语言规则说明
1. 这是规则
""",
        # 测试 4: 无标记(智能分割)
        """
(game "TestGame"
  (players 3)
)

这是自然语言规则说明
""",
    ]
    
    print("=" * 60)
    print("测试 GDL 提取功能")
    print("=" * 60)
    
    for i, test_content in enumerate(test_cases, 1):
        print(f"\n测试用例 {i}:")
        print("-" * 60)
        gdl, narrative = extract_gdl_and_narrative(test_content)
        
        if gdl or narrative:
            print(f"GDL 长度: {len(gdl)}")
            print(f"自然语言长度: {len(narrative)}")
        else:
            print("提取失败")
    
    print("\n" + "=" * 60)