如何用Python从Python代码中提取关键词?遇print语句提取难题
解决Python代码关键词提取问题
问题分析
你的代码未能成功提取目标内容,主要有两个原因:
- 字符串分割方式无效:
print('Hello World')作为一个整体被split()处理,无法拆出单独的print字符串。 - 概念混淆:
print是Python内置函数,并非语言关键词,keyword.iskeyword()会返回False,所以无法被识别。
解决方案:使用AST模块解析代码
Python的ast模块可以将代码解析为抽象语法树(AST),能准确识别代码的语法结构,是处理代码解析的可靠方式,完全避免字符串分割的局限性。
1. 提取Python语言关键词
以下代码可提取if、def、for等Python原生关键词:
import keyword import ast def extract_python_keywords(code): tree = ast.parse(code) keywords = set() for node in ast.walk(tree): # 根据节点类型识别关键词 node_type = type(node).__name__.lower() if node_type in keyword.kwlist: keywords.add(node_type) # 处理特殊节点类型对应的关键词 if isinstance(node, ast.FunctionDef): keywords.add('def') if isinstance(node, ast.ClassDef): keywords.add('class') if isinstance(node, ast.ImportFrom): keywords.add('from') keywords.add('import') return sorted(keywords) # 测试示例 test_code = """ print('Hello World') if True: for i in range(5): def foo(): pass """ print("提取的Python关键词:", extract_python_keywords(test_code))
2. 同时提取关键词和内置函数
如果需要识别print这类内置函数,可结合builtins模块扩展功能:
import keyword import ast import builtins def extract_keywords_and_builtins(code): tree = ast.parse(code) extracted = set() builtin_names = set(dir(builtins)) for node in ast.walk(tree): # 提取语言关键词 node_type = type(node).__name__.lower() if node_type in keyword.kwlist: extracted.add(node_type) if isinstance(node, ast.FunctionDef): extracted.add('def') if isinstance(node, ast.ClassDef): extracted.add('class') if isinstance(node, ast.ImportFrom): extracted.add('from') extracted.add('import') # 提取内置函数调用 if isinstance(node, ast.Call) and isinstance(node.func, ast.Name): func_name = node.func.id if func_name in builtin_names: extracted.add(func_name) return sorted(extracted) # 测试示例 test_code = "print('Hello World')" print("提取的关键词和内置函数:", extract_keywords_and_builtins(test_code))
代码说明
ast.parse():将输入代码转换为抽象语法树,让程序能理解代码的语法逻辑。ast.walk():遍历语法树的所有节点,逐个识别语法元素。- 内置函数识别:通过
builtins模块获取所有内置函数名称,匹配代码中的函数调用节点。
内容的提问来源于stack exchange,提问作者Darshil
相关产品推荐
相关产品推荐

