2012-08-08 103 views
0

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

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

(42 'Thirty_Years \' _战争 '33,5,0,0)

使用命令

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

我不能确定在中间的单引号'三十年''战争',当'行'是从一个文本文件解析。

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

的人的车

的人的汽车的汽油

霍奇斯Harbrace手册

'霍奇斯' Harbrace手册 '

portspeople',1475,29,0,0) ,(42,'Thirty_Years'_ War',33,5,0,0)

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

的人的车

的人的车“的汽油

霍奇斯” Harbrace手册

('Hodges的 'Harbrace手册 ')

portspeople',1475,29,0,0),(42, 'Thirty_Years \' _战争',33,5,0,0)

使用命令

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

打破它。

的人的车

的人' '' '的车' '''S汽油

霍奇斯” Harbrace手册

( '' '' '' 'Hodges'''''''Harbrace手册''''''''), 0),(42, '' '' '' '' '' '' '' '' Thirty_Years \ '' '' '' '' '' '' '' '' _战争 '' '' '' ''” ''''''',33,5,0,0)

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

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

回答

1

如果转储由之类的东西,你所提供的字符串,你可以尝试这样的事:

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

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

编辑:仅使用正则表达式解析时,有没有更好的办法:)

+0

包含'r'前缀修正了它。 “字符串文字可以选择以字母'r'或'R'为前缀;这些字符串被称为原始字符串,并使用不同的规则来解释反斜杠转义序列。” 我不得不稍微改变那个正则表达式代码来组合撇号及其周围的字母,对吧? 为什么只使用正则表达式作为最后的手段?谢谢 – 2012-08-08 01:34:55

+1

好东西。我给出的正则表达式将捕获所有不在课堂上的一组角色。也许你可能会遇到字符串逗号问题。正则表达式对于部分字符串模式匹配很有用,但对于解析结构化文档来说,有可能是为了支持语法而构建的解析器。任何与正则表达式的解决方案可能会做得很好,但不是一个完美的解决方案。例如,使用XML解析器比使用正则表达式更清洁,因为它将支持嵌套标记和所有标记规则。 – 2012-08-09 14:36:14

0

大多数Python数据库接口将为您处理引用SQL语句。例如,与psycopg驱动程序,你会写是这样的:

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

...和数据库驱动程序将采取的正确引用的值,照顾你。看看in the documentation的一些例子。事实上,他们的第一个例子非常像这个。

+0

我应该使人们更清楚地表明脚本编写的SQL转储的另一个副本到一个SQL文件,有固定的撇号。 Psycopg实际上不是这个的一部分。但是这是导入SQL转储的另一种方式。 – 2012-08-08 01:37:19