我想使用正则表达式在子字符串中搜索以某些字符开头的行。我有一个 SQL 字符串 -
qry = '''
with
qry_1 as ( -- some text
SELECT ID,
NAME
FROM ( ... other code...
),
qry_2 as (
SELECT coalesce (table1.ID, table2.ID) as ID,
NAME
FROM (...other code...
),
qry_3 as (
-- some text
SELECT id.WEATHER AS WEATHER_MORN,
ROW_NUMBER() OVER(PARTITION BY id.SUN
ORDER BY id.TIME) AS SUN_TIME,
id.RAIN,
id.MIST
FROM (...other code..
-- some other text
)
'''
我能够通过re.findall
提取子查询信息 这里 -
sub = re.findall(r'' '(.+?) (?i)as (',qry)
sub
输出qry_1, qry_2, qry_3
的位置 我希望能够提取以该字符开头的任何行,--
sub
中标识的行。这样的东西适用于我在这里获得帮助的字符串值-
# search substring between strings
params = [re.findall('^w+|(?:--)|(?<=.)(?:--)', i)
for i in re.findall('w+s(?i)ass([sw.,n]+', qry)]
dict_result = {a:None if not b else b for a, *b in params}
dict_result = dict([(k,dict_result[k]) for k in sub])
dict_result
但是如何合并starts with
特殊字符--
?所以输出是这样的——
{'qry_1' : 'some text', 'qry_2': 'None', 'qry_3': 'some text, some other text'}
感谢您在这里的指导
对于示例数据,一个选项是对组 1 中as (
之前的所有部件使用捕获组,并捕获组 2 中不包含as (
的所有行。
^(.+?) as ((.*(?:n(?!.* as ().*)*)n)
^
字符串的开头(.+?)
捕获组 1as (
比赛as (
(
捕获组 2.*
匹配行的其余部分(?:n(?!.* as ().*)*
)
关闭组 1n)
匹配换行符和)
然后,您可以使用组 1 作为字典的键,并使用组 2 的值使用 re.findall 查找以--
开头的字符串,并在捕获组中再次捕获后面的内容,这将由 re.findall 返回。
import re
regex = r"^(.+?) as ((.*(?:n(?!.* as ().*)*)n)"
dict_result = {}
s = "the example string here"
for tup in re.findall(regex, s, re.MULTILINE):
matches = re.findall(r"-- (.*)", tup[1])
dict_result[tup[0]] = matches if len(matches) > 0 else None
print(dict_result)
输出
{'qry_1': ['some text'], 'qry_2': None, 'qry_3': ['some text', 'some other text']}
正则表达式演示 |蟒蛇演示