2012-06-22 87 views
0

我試圖將一個巨大的SQL文件分解成小的SQL文件,我使用python來實現這一點,但我使用的代碼不匹配,從我在google上看到它應該。Python的正則表達式的難題

下面是代碼:

import sys, re 
    p = [0] 
    f = open('/root/testsql/data.sql', 'r') 
    tables =["tabel1", "table2"] 
    contor = 0; 
    con = 0; 

    for line in f: 
     for table in tables: 
      stri = "root/testsql/" + str(con) 
      con = con + 1 
      stri2 = ".*" + table + ".*" 
      if re.match(stri2,line): 
        print table 
        f2 = open(stri,"w") 
        f2.write(line) 
        f2.close() 

如果有人有一個想法,爲什麼re.match不工作,這將是大加讚賞。

SQL文件很長(73595線),包含線,如:

insert into table ... 
insert into table 
+0

當您寫入f2時,輸出是什麼?編輯:或者是根本沒有發生? – danseery

+0

我沒有輸出,就是這個問題。我有打印表格,如果只是爲了驗證我輸入了if但沒有輸出,所以它不會進入循環 – primero

+0

複製您爲行和表顯示的文本,然後執行're.match'確實導致了匹配。你確定你顯示的文字是你從文件中得到的嗎? – GreenMatt

回答

3

你只是在尋找逐字字符串。在這種情況下,正則表達式是矯枉過正。相反,使用in

for line in f: 
    for table in tables: 
     # snip... 
     if table in line: 
      # ... 
+0

公頃,好點 – Aprillion

+0

我認爲匹配不是問題。我用你的建議,但仍然沒有結果。沒有文件被創建,並且控制檯輸出中沒有顯示任何文件。事情是有73595行,其中一些非常長,也許這就是爲什麼它不起作用。 – primero

+0

我測試從python控制檯,它與您的建議,但仍然從腳本不起作用。 – primero

2

我覺得

stri2 = ".*" + table + ".*" 

應該是:

stri2 = ".*?" + table + ".*" 

*爲貪婪並且將匹配整條線。

+1

這樣應該會更快,但'。*'應該首先回溯 – Aprillion

+0

仍然沒有輸入if語句。我試圖在Python的控制檯我的匹配語句,它似乎工作,但我似乎無法進入如果從我的腳本。 – primero

+0

而你可以從if語句中的代碼中看到我創建了一些文件。他們沒有被創造。我是新來的蟒蛇我不知道如何調試。 – primero

1

您應該使用re.search而不是re.match,而不是在.*中包裝正則表達式。

您看不到匹配的原因是輸入以換行符結束,並且點元字符與換行符不匹配。

+0

我的初稿是用re.search,我用re.compile來創建我的模式,但我不知道如何在if語句中測試。 – primero

+0

f2不是一個文件,而是很多文件,每個週期1個,所以'w'在這種情況下可以使用 – Aprillion

+0

但現在我認爲它可能與我的示例相同 – primero

0

我會在任何正則表達式使用原始字符串,而不是一個簡單的字符串,這樣你就不會最終愚弄自己,當一個char得到解釋。

r'。*'+ table + r'。''