如果一个文件中有很多视图,另一个选项是防止使用
.*?
具有
re.DOTALL
防止不必要的回溯。
相反,您可以匹配
VIEW
到
SELECT
到
FROM
检查介于两者之间的内容是否是另一个关键字,以防止使用负面前瞻进行过多匹配(假设这些不会发生在两者之间)
对于FROM之后的最后一部分,可以匹配单词字符,可以选择使用空格字符和单词字符重复。
^(VIEW\s+(\w+))(.*(?:\n(?!SELECT|VIEW|FROM).*)*)\nSELECT\s+(.*(?:\n(?!SELECT|VIEW|FROM).*)*)\nFROM\s+(\w+(?:\s+\w+));
模式匹配:
-
^
字符串开头
-
(VIEW\s+(\w+))
捕获组以供查看,后面是一组字符
-
(.*(?:\n(?!SELECT|VIEW|FROM).*)*)
捕获与其余行匹配的组,以及所有不以关键字开头的行
-
\nSELECT\s+
匹配换行符,选择1+空格
-
(.**:\n(?!选择|查看|自)。*)*)
捕获与其余行匹配的组,以及所有不以关键字开头的行
-
\nFROM\s+
匹配换行符、FROM和1+空格字符
-
(\w+(?:\s+\w+))
; 为FROM的值捕获组,匹配1+个单词字符,并可选地按空格字符和单词字符重复
Regex demo
例如(您可以省略
re.VERBOSE
和
重新。多塔尔
)
import re
methodRegex = r"^^(VIEW\s+(\w+))(.*(?:\n(?!SELECT|VIEW|FROM).*)*)\nSELECT\s+(.*(?:\n(?!SELECT|VIEW|FROM).*)*)\nFROM\s+(\w+(?:\s+\w+));"
fContent = ("VIEW Company_Person_Sd IS\n"
" Prompt = 'Company'\n"
" Company.Prompt = 'Company ID'\n"
"SELECT company_id company_id,\n"
" emp_no emp_no,\n"
" Get_Person(company_id, emp_no) person_id,\n"
" cp.rowid objid,\n"
" to_char(cp.rowversion) objversion,\n"
" rowkey objkey\n"
"FROM companies cp;")
methodMatches = re.finditer(methodRegex, fContent, re.MULTILINE | re.IGNORECASE)
for methodMatchNum, methodMatch in enumerate(methodMatches, start=1):
methodContent = methodMatch.group()
methodNameFull = methodMatch.group(1)
methodType = methodMatch.group(2)
methodName = methodMatch.group(3)