【问题标题】:Extract certain portion of multiline string using Python re [duplicate]使用Python re提取多行字符串的某些部分[重复]
【发布时间】:2020-07-17 17:56:02
【问题描述】:

我一直试图在多行文本中提取 SQL 查询,但我一直得到错误的输出。

如何获取一个或三个引号之间的文本?

注意:在第一个完整引号 ''""""""""'''''' 之前和之后可以有任何内容,我只对找到引号之间的第一个文本感兴趣。

import re

cell_text = """\
#%%sql
q = \"\"\"
select 
name, breed, sum(weight) over (partition by breed order by name) as running_total_weight
from cats 
order by breed, name
\"\"\"

f(q)
"""
print(cell_text)

我的尝试:

pat = """.*select(.*)['"].*"""
out = re.findall(pat,cell_text,flags=re.M)[0]
sql = 'select ' + out
print(sql)

# I am getting empty outputs for re.findall instead of text there.

需要的输出:

input
----

#%%sql
q = """
select 
name, breed, sum(weight) over (partition by breed order by name) as running_total_weight
from cats 
order by breed, name
"""

f(q)

output
------

select 
name, breed, sum(weight) over (partition by breed order by name) as running_total_weight
from cats 
order by breed, name


input
-----
#%%sql
q = "select * from cats;"

f(q)

output
-------
select * from cats;

input
-----
q = 'select * from cats limit 2'

output
------
select * from cats limit 2

【问题讨论】:

  • 我认为问题在于 .* 最终匹配引号因此无法匹配,使用 [^"] 可能相关?
  • 1) 你需要点所有标志。 2)您忘记匹配引号。 3) 你不需要select 或那三个点星。

标签: python regex python-re


【解决方案1】:

您需要像这样使用DOTALL(?s) 模式:

>>> print (re.findall(r'(?s)"""(.*?)"""', cell_text)[0])

select
name, breed, sum(weight) over (partition by breed order by name) as running_total_weight
from cats
order by breed, name

您也可以在re.findall 中使用flags 参数:

re.findall(r'"""(.*?)"""', cell_text, flags=re.DOTALL)

编辑:请注意,要匹配所有单引号或三引号文本,您可以将此正则表达式与交替使用:

r"""\"\"\"(.*?)\"\"\"|'''(.*?)'''|"(.*?)"|'(.*?)'"""

RegEx Demo

【讨论】:

  • 我试过re.findall(pat,cell_text,flags=re.MULTILINE|re.DOTALL)[0],但最后得到了两个额外的引号"",如何避免额外的尾随引号?
  • @astro123 要获得第一场比赛,请使用re.searchre.findall 返回多个匹配项。
  • 模式不能是pat=r'"""(.*?)"""',因为查询可以是q = "myquery"q = """ myquery""",即单引号和三引号之间的任何内容。不仅是三重双引号。
  • 这是对您在使用pat = """.*select(.*)['"].*""" 的地方显示的代码的修复。请提供一些单引号匹配的示例
  • 要匹配所有这些情况,您可以使用这个正则表达式:r"""\"\"\"(.+?)\"\"\"|'''(.+?)'''|"(.+?)"|'(.+?)'"""
猜你喜欢
  • 2022-11-13
  • 1970-01-01
  • 1970-01-01
  • 2019-04-14
  • 1970-01-01
  • 1970-01-01
  • 2012-03-28
  • 1970-01-01
  • 2018-06-29
相关资源
最近更新 更多