【问题标题】:Python parsing update statements using regexPython 使用正则表达式解析更新语句
【发布时间】:2021-05-21 10:53:11
【问题描述】:

我正在尝试在 python 中找到一个正则表达式,它能够处理我从我的数据库中抛出的大多数 UPDATE 查询。我不能使用 sqlparse 或任何其他可能对此有用的库,我只能使用 python 的内置模块或 cx_Oracle,以防它有一个我不知道的方法可以做这样的事情。

大多数更新查询如下所示:

UPDATE TABLE_NAME SET COLUMN_NAME=2, OTHER_COLUMN=to_date('31-DEC-202023:59:59','DD-MON-YYYYHH24:MI:SS'), COLUMN_STRING='Hello, thanks for your help', UPDATED_BY=-100 WHERE CODE=9999;

我使用的大多数更新查询都有这些类型更新的版本。输出必须是一个列表,包括每个单独的 SQL 关键字(UPDATE、SET、WHERE)、每个单独的更新语句(即 COLUMN_NAME=2)和最终标识符(CODE=9999)。

理想情况下,结果应该是这样的:

list = ['UPDATE', 'TABLE_NAME', 'SET', 'COLUMN_NAME=2', 'OTHER_COLUMN=("31-DEC-2020 23:59:59","DD-MON-YYYY HH24:MI:SS")', COLUMN_STRING='Hello, thanks for your help', 'UPDATED_BY=-100', 'WHERE', 'CODE=9999']

最初我尝试在空格上使用string.split() 拆分来执行此操作,但是在处理像上面这样稍微复杂的查询之一时,split 方法不能很好地处理字符串更新,例如由于这些更新中有空格,我正在尝试在COLUMN_STRING 或OTHER_COLUMN 中制作一个。

【问题讨论】:

  • .split(",(?=(?:[^\"]*\"[^\"]*\")*[^\"]*$)") 将按照此处的说明为您服务:answer
  • @Younes 感谢您的回复。不幸的是,这个正则表达式不能很好地处理其中有逗号的日期值或字符串更新,因为它似乎在逗号上分割了一个字符串。此外,我不会在 UPDATE、SET、WHERE、关键字处拆分字符串。这意味着我最终在列表的 0 索引中得到一个 UPDATE TABLE_NAME SET COLUMN_NAME=2,我希望我的第 0 个索引是 UPDATE,第一个索引是 TABLE_NAME,等等。
  • 啊我明白了,我会发布一个解决方法的答案,让你得到你想要的。

标签: python sql regex python-2.7 parsing


【解决方案1】:

让我们使用 shlex 模块:

import shlex
test="UPDATE TABLE_NAME SET COLUMN_NAME=2, OTHER_COLUMN=to_date('31-DEC-202023:59:59','DD-MON-YYYYHH24:MI:SS'), COLUMN_STRING='Hello, thanks for your help', UPDATED_BY=-100 WHERE CODE=9999;"

t=shlex.split(test)

到这里为止,我们不会去掉逗号分隔符和最后一个半分隔符,所以也许我们可以这样做:

for i in t:
    if i[-1] in [',',';']:
        i=i[:-1]

如果我们打印该列表的每个元素,我们将得到:

UPDATE
TABLE_NAME
SET
COLUMN_NAME=2
OTHER_COLUMN=to_date(31-DEC-202023:59:59,DD-MON-YYYYHH24:MI:SS)
COLUMN_STRING=Hello, thanks for your help
UPDATED_BY=-100
WHERE
CODE=9999

不是一个适当的通用答案,但可以达到我希望的目的。

【讨论】:

  • 这太棒了!完美解决了我的问题。非常感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-23
  • 2014-06-26
  • 1970-01-01
相关资源
最近更新 更多