使用正则表达式Python 3

时间:2018-03-15 17:52:54

标签: python sql regex python-3.x

我尝试使用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)

提前感谢您的帮助。

1 个答案:

答案 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之前强制执行空白,所以我猜到了你正在尝试做什么。