0

我正在尝试使用 Python 正则表达式库解析 Wikipedia SQL 转储。最终目标是将这个转储导入 PostgreSQL,但我知道字符串中的撇号需要事先加倍。

但是,此转储中字符串中的每个撇号前面都有一个反斜杠,我宁愿不删除反斜杠。

(42,'Thirty_Years\'_War',33,5,0,0)

使用命令

re.match(".*?([\w]+?'[\w\s]+?).*?", line)

当从文本文件中解析 'line' 时,我无法识别 'Thirty_Years\'_War' 中间的撇号。

作为比较,这些行在解析时工作正常(没有最后一行)。

该人的车

人的车的汽油

霍奇斯的哈布雷斯手册

'霍奇斯'哈布雷斯手册'

港口人',1475,29,0,0),(42,'Thirty_Years\'_War',33,5,0,0)

正确和预期的输出(没有最后一行):

人的车

人的车的汽油

霍奇斯的哈布雷斯手册

('霍奇斯''哈布雷斯手册')

港口人',1475,29,0,0),(42,'Thirty_Years\'_War',33,5,0,0)

使用命令

re.match(".*?([\w\\]+?'[\w\s]+?).*?", line)

打破它。

人的车

人''''车''''汽油

霍奇斯的哈布雷斯手册

(''''''''霍奇斯''''''''哈布雷斯手册'''''''')

港口人''''''''''''''',1475,29,0,0),(42,''''''''''''''''Thirty_Years\'' ''''''''''''''_War''''''''''''''',33,5,0,0)

它是否陷入某种循环?要使用的正确正则表达式代码是什么?

我没有考虑 SQL 注入攻击,因为该脚本仅用于解析维基百科文章的转储(不包含 SQL 注入攻击的示例)。

4

2 回答 2

1

如果转储包含您提供的字符串之类的内容,您可以尝试以下操作:

re.findall(r"[^,\(\)]+")

其中字符类包含所有已知的分隔符。

编辑:只有在没有更好的方法时才使用正则表达式进行解析:)

于 2012-08-08T01:10:06.243 回答
0

大多数 Python 数据库接口都会为您处理引用 SQL 语句。例如,使用psycopg驱动程序,您可以编写如下内容:

mystring="""This is 'a string' that contains single quotes."""
c.execute('INSERT INTO mytable (mycolumn) VALUES (%s)', mystring)

...并且数据库驱动程序将负责为您正确引用值。查看文档中的一些示例。事实上,他们的第一个例子与这个非常相似。

于 2012-08-08T01:08:24.003 回答