如何用抽象语法树工具ast解析str格式的文本数据
LLM时代很多时候需要处理的数据不是结构化数据,而是文本数据。比如
"[('AC/DC',), ('Accept',), ('Aerosmith',), ('Alanis Morissette',), ('Alice In Chains',), ('Antônio Carlos Jobim',), ('Apocalyptica',), ('Audioslave',), ('BackBeat',)]"
虽然我们知道这是一个list数据,但实际上它是str,它不能被python按list的方式处理。
这里先了解抽象语法书工具ast,然后尝试用ast解析python函数、文本print形式的list串。
1 ast工具
抽象语法树工具ast(Abstract Syntax Tree),可用于解析python类代码并将其转换为树状结构,解析后的树状结构称为抽象语法树,是一种中间表示形式,可用于代码分析、修改和生成。
抽象语法树是一个树状的数据结构,表示源代码的语法结构。每个节点都代表源代码中的一个结构,例如函数定义、循环语句、条件语句等。
将str格式文本转化为抽象语法树后,就可以直接进行多种后续处理,如代码分析、修改和生成。
2 ast解析函数
2.1 解析函数
以下是ast解析python函数示例
import astcode = """
def add(a, b):return a + b
"""tree = ast.parse(code)
for node in ast.walk(tree):print(ast.dump(node, indent=4))
2.2 语法树
输出如下所示,这是一个功能完整的抽象语法树。
Module(
body=[
FunctionDef(
name='add',
args=arguments(
posonlyargs=[],
args=[
arg(arg='a'),
arg(arg='b')],
kwonlyargs=[],
kw_defaults=[],
defaults=[]),
body=[
Return(
value=BinOp(
left=Name(id='a', ctx=Load()),
op=Add(),
right=Name(id='b', ctx=Load())))],
decorator_list=[])],
type_ignores=[])
FunctionDef(
name='add',
args=arguments(
posonlyargs=[],
args=[
arg(arg='a'),
arg(arg='b')],
kwonlyargs=[],
kw_defaults=[],
defaults=[]),
body=[
Return(
value=BinOp(
left=Name(id='a', ctx=Load()),
op=Add(),
right=Name(id='b', ctx=Load())))],
decorator_list=[])
arguments(
posonlyargs=[],
args=[
arg(arg='a'),
arg(arg='b')],
kwonlyargs=[],
kw_defaults=[],
defaults=[])
Return(
value=BinOp(
left=Name(id='a', ctx=Load()),
op=Add(),
right=Name(id='b', ctx=Load())))
arg(arg='a')
arg(arg='b')
BinOp(
left=Name(id='a', ctx=Load()),
op=Add(),
right=Name(id='b', ctx=Load()))
Name(id='a', ctx=Load())
Add()
Name(id='b', ctx=Load())
Load()
Load()
3 ast解析list串
3.1 解析list
这里尝试用ast将str形式的list,解析为真实的list,ast示例程序如下所示。
import ast
import reorigin_txt = "[('AC/DC',), ('Accept',), ('Aerosmith',), ('Alanis Morissette',), ('Alice In Chains',), ('Antônio Carlos Jobim',), ('Apocalyptica',), ('Audioslave',), ('BackBeat',)]"
obj_list = ast.literal_eval(origin_txt)print(f"origin txt: {origin_txt}")
print("processed txt:")
for obj in obj_list:txt = obj[0]post_txt = re.sub(r"\b\d+\b", "", txt).strip()print(post_txt)
3.2 真实list
输出结果如下所示,可见ast成功将str格式list解析为真实list,以便后续程序直接处理。
origin txt: [('AC/DC',), ('Accept',), ('Aerosmith',), ('Alanis Morissette',), ('Alice In Chains',), ('Antônio Carlos Jobim',), ('Apocalyptica',), ('Audioslave',), ('BackBeat',)]
processed txt:
AC/DC
Accept
Aerosmith
Alanis Morissette
Alice In Chains
Antônio Carlos Jobim
Apocalyptica
Audioslave
BackBeat
reference
---
python中ast模块的详解与用法
https://blog.csdn.net/weixin_54897474/article/details/140095287
基于langgraph agent的SQL DB知识库系统
https://blog.csdn.net/liliang199/article/details/153317678
