天天看點

perl轉python_将Perl轉換為Python

在使用正規表達式替換的行中,比對組的插入必須是雙轉義的,或者替換字元串必須以r作為字首以标記為正規表達式:line = re.sub(r"([^'])'t'(.)", "\\1THIS_IS_TRUE\\2", line)

或者line = re.sub(r"([^'])'f'(.)", r"\1THIS_IS_FALSE\2", line)

此外,在列印之前還應添加以下行:line = line.replace('AUTOINCREMENT', 'AUTO_INCREMENT')

最後,在MySQL中,create語句中的列名應該是backticks。在第15行中添加:sub = sub.replace('"','`')

以下是經過修改的完整腳本:import re, fileinput

def main():

for line in fileinput.input():

process = False

for nope in ('BEGIN TRANSACTION','COMMIT',

'sqlite_sequence','CREATE UNIQUE INDEX'):

if nope in line: break

else:

process = True

if not process: continue

m = re.search('CREATE TABLE "([a-z_]*)"(.*)', line)

if m:

name, sub = m.groups()

sub = sub.replace('"','`')

line = '''DROP TABLE IF EXISTS %(name)s;

CREATE TABLE IF NOT EXISTS %(name)s%(sub)s

'''

line = line % dict(name=name, sub=sub)

else:

m = re.search('INSERT INTO "([a-z_]*)"(.*)', line)

if m:

line = 'INSERT INTO %s%s\n' % m.groups()

line = line.replace('"', r'\"')

line = line.replace('"', "'")

line = re.sub(r"([^'])'t'(.)", "\\1THIS_IS_TRUE\\2", line)

line = line.replace('THIS_IS_TRUE', '1')

line = re.sub(r"([^'])'f'(.)", "\\1THIS_IS_FALSE\\2", line)

line = line.replace('THIS_IS_FALSE', '0')

line = line.replace('AUTOINCREMENT', 'AUTO_INCREMENT')

if re.search('^CREATE INDEX', line):

line = line.replace('"','`')

print line,

main()