Python 正则表达式搜索以子字符串中的某些字符开头的行



我想使用正则表达式在子字符串中搜索以某些字符开头的行。我有一个 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)
  • ^字符串的开头
  • (.+?)捕获组 1
  • as (比赛as (
  • (捕获组 2
    • .*匹配行的其余部分
    • (?:n(?!.* as ().*)*
  • )关闭组 1
  • n)匹配换行符和)

然后,您可以使用组 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']}

正则表达式演示 |蟒蛇演示

相关内容

  • 没有找到相关文章

最新更新