【问题标题】:Python regular expression for mysqldump inserts用于 mysqldump 插入的 Python 正则表达式
【发布时间】:2018-04-11 13:20:14
【问题描述】:

我有一堆这样的字符串格式的查询:

INSERT INTO users VALUES (1,'pb',NULL,'User 示例','example@example','','da',1493878226,NULL,NULL,'das','unassigned','','','','','','','' ,1,'',NULL,'',NULL,'','','','',1,0,0,25495,NULL,'','',0,0,0,'', NULL,''),(2,'pb',NULL,'用户 Example','example@example','','a774f',1493878226,NULL,NULL,'device','unassigned','','','','','','','' ,1,'',NULL,'',NULL,'','','','',0,0,0,NULL,NULL,'','',0,0,0,'', NULL,''),(3,'p=',NULL,'用户 示例','example@example','','95fa',1493878226,NULL,NULL,'device','b','','','','','','','' ,1,'',NULL,'',NULL,'','','','',0,0,0,NULL,NULL,'','',0,0,0,'', NULL,''),(4,'pa',NULL,'用户 示例','example@example','','ea1',1493878226,1510178200,NULL,'a','未分配','','','','','','','' ,1,'',NULL,'',NULL,'','','','',0,0,0,NULL,NULL,'','',0,1,0,'', NULL,''),(5,'pb',NULL,'AAA','example@example','','das',1493878226,NULL,NULL,'a','unassigned','',' ','dasmin.png','','','','',1,'',NULL,'',NULL,'','','','',0,0,0, NULL,NULL,'','',0,0,0,'',NULL,'');

我想要做的是能够用 () 分隔分隔文本的每个部分,以便我可以遍历它们,更改一些内容,然后进行手动插入。

我该怎么办?

顺便说一句,我不擅长正则表达式......

【问题讨论】:

  • 你能发布你的预期输出吗?

标签: python mysql regex


【解决方案1】:

我使用 Python 和 SQL 做了一些工作,所以我想我知道你想要做什么。试试这个:

import re

sql_text = "INSERT INTO users VALUES (1,'pb',NULL,'User Example','example@example','','da',1493878226,NULL,NULL,'das','unassigned','','','','','','','',1,'',NULL,'',NULL,'','','','',1,0,0,25495,NULL,'','',0,0,0,'',NULL,''),(2,'pb',NULL,'User Example','example@example','','a774f',1493878226,NULL,NULL,'device','unassigned','','','','','','','',1,'',NULL,'',NULL,'','','','',0,0,0,NULL,NULL,'','',0,0,0,'',NULL,''),(3,'p=',NULL,'User Example','example@example','','95fa',1493878226,NULL,NULL,'device','b','','','','','','','',1,'',NULL,'',NULL,'','','','',0,0,0,NULL,NULL,'','',0,0,0,'',NULL,''),(4,'pa',NULL,'User Example','example@example','','ea1',1493878226,1510178200,NULL,'a','unassigned','','','','','','','',1,'',NULL,'',NULL,'','','','',0,0,0,NULL,NULL,'','',0,1,0,'',NULL,''),(5,'pb',NULL,'AAA','example@example','','das',1493878226,NULL,NULL,'a','unassigned','','','dasmin.png','','','','',1,'',NULL,'',NULL,'','','','',0,0,0,NULL,NULL,'','',0,0,0,'',NULL,'');"
sql_list = re.findall("\([^)]+\)", sql_text)
for sql_item in sql_list:
    print(sql_item)

我获取 SQL 文本,并将每组值正则表达式到一个列表中。正则表达式本身是关键,它是一个否定字符类。它匹配每个开始参数直到并包括下一个结束参数。 [^)]+ 表示所有非关闭参数。

显然,您希望更改文本而不是打印 (sql_item),但这应该足以让您继续前进。

这是一个使用正则表达式的好网站: https://www.regex101.com

【讨论】:

  • 如果值中间有() 怎么办,例如query="INSERT INTO users VALUES (1,'pb',NULL,'User),( Example','example@example', ..."
  • 示例中没有,但我明白你在说什么。您可以检查创建的长度列表,如果正确,您就可以开始了。如果不尝试拆分:),(我会在过度设计解决方案之前尝试它。使用正则表达式通常是反复试验。
  • 太棒了!它就像一个冠军,谢谢,真的很感激。 :)
  • 太棒了! @ user202890 如果您可以将答案标记为已接受并投票(答案旁边的复选标记和向上箭头),那就太好了。谢谢!
【解决方案2】:

如果我正确理解您需要单独设置每个插入值,您可以尝试以下操作:

import re
values = re.findall(r'(\(.*?\))', query) #this would match the '(' and ')' too
values = re.findall(r'\((.*?)\)', query) #if you don't want to capture the braces

正则表达式将使用.* 查找() 之间的模式。 ? 使搜索不贪心。否则 .* 将匹配到最后一个 )

【讨论】:

  • 如果字符串中间有()怎么办,例如query="INSERT INTO users VALUES (1,'pb',NULL,'User),( Example','example@example', ..."
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-13
  • 1970-01-01
相关资源
最近更新 更多