gpt4 book ai didi

python - 如何使用正则表达式按顺序提取文本?

转载 作者:行者123 更新时间:2023-12-03 14:53:37 24 4
gpt4 key购买 nike

我正在研究一个 python 流脚本。它基本上解析 SQL 语句并获取目标表和源表。
例子

CREATE TABLE TAR_TAB1 AS
SELECT * FROM SRC_TAB1 JOIN SRC_TAB2

CREATE TABLE TAR_TAB2 AS
SELECT * FROM SRC_TAB3 JOIN SRC_TAB4

INSERT INTO TAR_TAB3 AS
SELECT * FROM SRC_TAB5 JOIN SRC_TAB6


我写了正则表达式
target = re.findall(r'\w+(?=\s+AS)', data)
source = re.findall(r'(?:FROM|JOIN)\s*([^\s]+), data)

结果如预期,
target list contains, TAR_TAB1, TAR_TAB2, TAR_TAB3
source list contains, SRC_TAB1, SRC_TAB2, SRC_TAB3, SRC_TAB4, ETC

如何获得像列表或数据帧一样的输出,
最好是数据帧,因此提取流程不会受到干扰。
target         source
TAR_TAB1 SRC_TAB1
TAR_TAB1 SRC_TAB2
TAR_TAB2 SRC_TAB3
TAR_TAB2 SRC_TAB4
TAR_TAB3 SRC_TAB5
TAR_TAB4 SRC_TAB6

最佳答案

这是一个解决方案:

targets = re.findall(r'(?:CREATE\s+TABLE|INSERT\s+INTO)\s+([a-z0-9A-Z_]+)\s+AS', text)
sources = re.findall(r'SELECT\s+\*\s+FROM\s([a-z0-9A-Z_]+)\s+JOIN\s+([a-z0-9A-Z_]+)', text)

# each target has multiple sources, so repeat each target n times per
# number of sources.
lens = [len(src) for src in sources]
targets = np.repeat(targets, lens)

# 'flatten' the list of sources from [(t1, t2), (t3, t4)] to
# [t1, t2, t3, t4]
sources = [tab for exp in sources for tab in exp]

pd.DataFrame({"src": sources, "tgt": targets})

结果:
        src       tgt
0 SRC_TAB1 TAR_TAB1
1 SRC_TAB2 TAR_TAB1
2 SRC_TAB3 TAR_TAB2
3 SRC_TAB4 TAR_TAB2
4 SRC_TAB5 TAR_TAB3
5 SRC_TAB6 TAR_TAB3

关于python - 如何使用正则表达式按顺序提取文本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62014584/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com