2012-06-22 3 views
0

Я пытаюсь разбить огромный файл SQL в маленький sql-файл, и для этого я использую python, но код, который я использую, не соответствует и из того, что я видел на google it должен.Python regexp conundrum

Вот код:

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

ha, хорошая точка – Aprillion

+0

Я думаю, что совпадение не было проблемой. Я использовал ваше предложение, но все равно никакого результата. Файлы не создавались, и на вывод консоли ничего не показывалось. Дело в том, что есть 73595 строк, а некоторые из них очень длинные, и, возможно, поэтому это не работает. – primero

+0

Я тестировал консоль python и работал с вашим предложением, но все же из сценария он не работает. – primero

2

Я думаю

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

должен быть:.

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

В * является жадный и будет соответствовать всей линии.

+1

он должен быть быстрее таким образом, но '. *' Должен возвращаться в первую очередь. – Aprillion

+0

Все еще не входит в оператор if. Я попробовал на консоли python свой оператор соответствия, и он, похоже, сработал, но я не могу войти в if из моего скрипта. – primero

+0

И как вы можете видеть из кода в инструкции if, я создаю несколько файлов. Ни один из них не создается. Я новичок в python, и я не знаю, как отлаживать это. – primero

1

Вы должны использовать re.search вместо re.match вместо обертывания регулярного выражения в .*.

Причина, по которой вы не видите совпадений, состоит в том, что входы заканчиваются символом новой строки, а метасимвол точки не соответствует символам новой строки.

+0

Мой первый проект был с re.search, и я использовал re.compile для создания своего шаблона, но я не знаю, как тестировать в выражении if. – primero

+0

f2 не файл, а много файлов по 1 в каждом цикле, поэтому 'w' в этом случае в порядке. – Aprillion

+0

Но теперь, когда я думаю об этом, это может быть так же, как в моем примере – primero

0

Я хотел бы использовать сырую строку вместо простой строки в любом регулярном выражении, так что вы не до конца обманывать себя, когда символ интерпретируются.

r '. *' + Table + r '. *'