使用regexpython3捕获两个已知单词之间的所有多行文本

2024-05-16 10:44:45 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试使用Python的regex包捕获多行文本中的所有文本。我的文本是,你会注意到它是SQL。为什么这是相关的是,我想捕捉一切之间的“选择”短语和“从”短语。在下面的例子中,我有3个项目,column1,column2,sum(column3),但我可以有更多。 另外,我只知道我可能会有\n\r,但我不知道它是一个还是多个。你知道吗

SELECT
a11.Column1
, a12.Column2
,SUM(Column3)
FROM DB.MyFactTable a11
LEFT OUTER JOIN DB.MyDimTable_1 a12 ON 
(a11.k1 = a12.k1 AND a11.k2 = a12.k2 AND a12.k3 = a11.k3)
LEFT OUTER JOIN DB.MyDimTable_2 a13 ON 
(a11.k1 = a12.k2 AND a11.k4 = a12.k4 AND a12.k5 = a11.k5)
WHERE a11.Column_N IN (X1, X2, X3, X4)
GROUP BY 1,2

到目前为止,我的正则表达式

rgx_pat = (?<=SELECT)(\s)*.*\n.*
result = re.findall(rgx_pat,my_sql_above,re.MULTILINE)

事先谢谢你的帮助。你知道吗


Tags: and文本dbonk2k1leftselect
1条回答
网友
1楼 · 发布于 2024-05-16 10:44:45

我认为你的问题是你不知道^{}标志。你知道吗

如果你想找到一堆包括换行符在内的东西,你不需要试图找出一个除了换行符和换行符之外的所有东西的查询,只要使用DOTALL,现在.表示任何包括换行符的东西。你知道吗

所以:

query = '''SELECT
a11.Column1
, a12.Column2
,SUM(Column3)
FROM DB.MyFactTable a11
LEFT OUTER JOIN DB.MyDimTable_1 a12 ON 
(a11.k1 = a12.k1 AND a11.k2 = a12.k2 AND a12.k3 = a11.k3)
LEFT OUTER JOIN DB.MyDimTable_2 a13 ON 
(a11.k1 = a12.k2 AND a11.k4 = a12.k4 AND a12.k5 = a11.k5)
WHERE a11.Column_N IN (X1, X2, X3, X4)
GROUP BY 1,2
'''

rgx_pat = re.compile(r'SELECT\s(.*?)\sFROM', re.DOTALL)
result = rgx_pat.findall(query)

现在result将是:

['a11.Column1\n, a12.Column2\n,SUM(Column3)']

我不确定您是要.*?还是.*,以及是否要在SELECT之后和FROM之前强制使用空格,所以我猜测了您要执行的操作。你知道吗

相关问题 更多 >