我正在嘗試使用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注入攻擊的例子)。
包含'r'前綴修正了它。 「字符串文字可以選擇以字母'r'或'R'爲前綴;這些字符串被稱爲原始字符串,並使用不同的規則來解釋反斜槓轉義序列。」 我不得不稍微改變那個正則表達式代碼來組合撇號及其周圍的字母,對吧? 爲什麼只使用正則表達式作爲最後的手段?謝謝 – 2012-08-08 01:34:55
好東西。我給出的正則表達式將捕獲所有不在課堂上的一組角色。也許你可能會遇到字符串逗號問題。正則表達式對於部分字符串模式匹配很有用,但對於解析結構化文檔來說,有可能是爲了支持語法而構建的解析器。任何與正則表達式的解決方案可能會做得很好,但不是一個完美的解決方案。例如,使用XML解析器比使用正則表達式更清潔,因爲它將支持嵌套標記和所有標記規則。 – 2012-08-09 14:36:14