簡體   English   中英

使用regex Python 3捕獲兩個已知單詞之間的所有多行文本

[英]Capture all multiline text between two know words using regex Python 3

我正在嘗試使用Python的regex包捕獲跨多行文本的所有文本。 我所看到的文本是,您會注意到它是SQL。 之所以有意義,是因為我想捕獲“ SELECT”短語和“ FROM”短語之間的所有內容。 在下面的示例中,我有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)

先謝謝您的幫助。

我認為您的問題只是您對DOTALL標志DOTALL

如果要查找包括換行符在內的所有內容,則無需嘗試找出涉及除換行符和換行符之外的所有內容的查詢,只需使用DOTALL和now即可. 表示包括換行符在內的所有內容。

所以:

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之前強制使用空格,所以我猜到了您要嘗試執行的操作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM