Files
alpha_tools/check_llm_idea/check_llm_idea.py
T

199 lines
7.1 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/usr/bin/env python3
"""
脚本功能:读取当前目录下的 llm_idea.md 文件,
匹配 **Implementation Example**: 后面的内容,
并提取每个示例中函数调用的参数(变量名)
"""
import re
from pathlib import Path
def extract_implementation_examples(file_path):
"""
从markdown文件中提取所有Implementation Example的内容
Args:
file_path: Path对象,指向要读取的文件
Returns:
list: 匹配到的所有示例内容列表
"""
try:
content = file_path.read_text(encoding='utf-8')
except FileNotFoundError:
print(f"错误:找不到文件 {file_path}")
return []
except Exception as e:
print(f"读取文件时出错:{e}")
return []
# 正则匹配 **Implementation Example**: 后面的内容
pattern = r'\*\*Implementation Example\*\*:\s*`(.*?)`'
matches = re.findall(pattern, content, re.DOTALL)
return matches
def extract_variables_from_expression(expression):
"""
从表达式中提取所有变量名(函数参数中的变量)
排除数字常量(如 1, 5, 20, 60 等)
Args:
expression: 函数调用表达式字符串
Returns:
list: 提取到的变量名列表(保持出现顺序)
"""
# 匹配函数调用中的参数:函数名(参数1, 参数2, ...)
# 使用正则匹配所有在括号内、由逗号分隔的内容
variables = []
# 方法1:匹配所有函数调用括号内的内容
# 这个正则匹配函数名(参数列表)
func_call_pattern = r'(\w+)\s*\(([^()]*(?:\([^()]*\)[^()]*)*)\)'
def extract_from_text(text):
"""递归提取文本中的变量"""
# 查找所有函数调用
matches = re.finditer(func_call_pattern, text)
for match in matches:
func_name = match.group(1)
args_str = match.group(2)
# 分割参数(考虑嵌套括号)
args = split_args_keeping_nesting(args_str)
# 处理每个参数
for arg in args:
arg = arg.strip()
# 如果参数是数字,跳过
if re.match(r'^-?\d+(\.\d+)?$', arg):
continue
# 如果参数是函数调用,递归提取
if '(' in arg and ')' in arg:
extract_from_text(arg)
# 如果参数是变量名(字母、数字、下划线组成,以字母或下划线开头)
elif re.match(r'^[a-zA-Z_][a-zA-Z0-9_]*$', arg):
if arg not in variables: # 去重但保持顺序
variables.append(arg)
# 如果是复杂表达式(包含运算符),也尝试提取其中的变量
elif any(op in arg for op in ['+', '-', '*', '/', '>', '<', '=']):
extract_variables_from_complex_expression(arg)
def split_args_keeping_nesting(args_str):
"""
分割函数参数,考虑嵌套的括号
例如: "a, b, c" -> ['a', 'b', 'c']
"func(a,b), c" -> ['func(a,b)', 'c']
"""
args = []
current_arg = []
paren_count = 0
bracket_count = 0 # 方括号
brace_count = 0 # 花括号
for char in args_str:
if char == ',' and paren_count == 0 and bracket_count == 0 and brace_count == 0:
args.append(''.join(current_arg).strip())
current_arg = []
else:
current_arg.append(char)
if char == '(':
paren_count += 1
elif char == ')':
paren_count -= 1
elif char == '[':
bracket_count += 1
elif char == ']':
bracket_count -= 1
elif char == '{':
brace_count += 1
elif char == '}':
brace_count -= 1
if current_arg:
args.append(''.join(current_arg).strip())
return args
def extract_variables_from_complex_expression(expr):
"""从复杂表达式中提取变量(如 a + b * c)"""
# 匹配变量名(字母或下划线开头,后面跟字母、数字、下划线)
var_pattern = r'\b[a-zA-Z_][a-zA-Z0-9_]*\b'
# 排除常见的函数名和关键字
keywords = {'and', 'or', 'not', 'if', 'else', 'for', 'while', 'return',
'True', 'False', 'None', 'in', 'is', 'lambda'}
for match in re.finditer(var_pattern, expr):
var = match.group()
if var not in keywords and not re.match(r'^\d+$', var):
if var not in variables:
variables.append(var)
# 开始提取
extract_from_text(expression)
# 如果上面没提取到,尝试直接匹配简单变量(没有函数调用的表达式)
if not variables:
# 匹配简单的变量名
simple_var_pattern = r'\b[a-zA-Z_][a-zA-Z0-9_]*\b'
keywords = {'and', 'or', 'not', 'if', 'else', 'for', 'while', 'return',
'True', 'False', 'None', 'divide', 'subtract', 'add', 'abs',
'greater', 'equal', 'ts_delay', 'ts_mean', 'ts_std_dev',
'count_bias_adjusted_price_target_estimates', 'group_rank',
'zscore', 'days_from_last_change', 'ts_sum', 'power'}
for match in re.finditer(simple_var_pattern, expression):
var = match.group()
# 排除数字和函数名
if (not re.match(r'^\d+$', var) and
var not in keywords and
var not in ['and', 'or', 'not']):
if var not in variables:
variables.append(var)
return variables
def main():
# 使用Path模块获取当前文件路径
current_dir = Path.cwd()
file_path = current_dir / "llm_idea.md"
print(f"正在读取文件:{file_path}")
print("=" * 80)
# 提取所有Implementation Example
examples = extract_implementation_examples(file_path)
if not examples:
print("未找到匹配的 **Implementation Example**: `...` 内容")
return
print(f"找到 {len(examples)} 个 Implementation Example:\n")
# 遍历每个示例
for idx, example in enumerate(examples, 1):
print(f"{'='*80}")
print(f"示例 {idx}:")
print(f"{'-'*40}")
print(f"表达式: {example}")
print(f"{'-'*40}")
# 提取变量名
variables = extract_variables_from_expression(example)
if variables:
print(f"提取到的变量 ({len(variables)} 个):")
for var_idx, var in enumerate(variables, 1):
print(f" {var_idx}. {var}")
else:
print("未提取到变量名")
print() # 空行分隔
print("=" * 80)
print(f"处理完成!共处理 {len(examples)} 个示例")
if __name__ == "__main__":
main()