Spaces:
Sleeping
Sleeping
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)
|