2012-08-08 104 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