我尝试使用Python的正则表达式包捕获多行文本中的所有文本。我有的文字是,你会注意到它的SQL。为什么相关的是我想捕捉" SELECT"之间的所有内容。短语和" FROM"短语。在下面的示例中,我有3个项目,第1列,第2列,总和(第3列),但我可以有更多。
另外,我只知道我可能会有\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)
提前感谢您的帮助。
答案 0 :(得分:2)
我认为您的问题只是您不了解DOTALL
旗帜。
如果您尝试查找包含换行符在内的大量内容,则不需要尝试找出涉及所有内容的查询,只需使用新行和新行,只需使用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
之前强制执行空白,所以我猜到了你正在尝试做什么。