2012-11-13 6 views
5

Ich bin kein Python-Entwickler, aber ich bin ein Python-Skript zu convert SQLite to MySQLre.sub nicht alle Ersatz-Auftreten

mit Das vorgeschlagene Skript bekommt der Nähe, aber keine Zigarre, wie sie sagen.

Die Linie mir ein Problem gibt, ist:

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

... zusammen mit der entsprechenden Linie für falsch ('f'), natürlich.

Das Problem, das ich sehe, ist, dass nur das erste Auftreten von 't' in einer gegebenen Zeile ersetzt wird.

Also, Eingang in das Skript,

INSERT INTO "cars" VALUES(56,'Bugatti Veyron','BUG 1',32,'t','t','2011-12-14 18:39:16.556916','2011-12-15 11:25:03.675058','81'); 

... gibt ...

INSERT INTO "cars" VALUES(56,'Bugatti Veyron','BUG 1',32,THIS_IS_TRUE,'t','2011-12-14 18:39:16.556916','2011-12-15 11:25:03.675058','81'); 

ich erwähnt, ich bin kein Python-Entwickler, aber ich habe versucht, diese selbst zu beheben . Laut der Dokumentation, verstehe ich, dass re soll alle Vorkommen von "t" ersetzen.

Ich würde einen Hinweis schätzen, warum ich nur das erste Auftreten ersetze, danke.

Antwort

6

Die beiden Substitutionen Sie in Ihrem Beispiel überlappen wollen würden - das Komma zwischen zwei Instanzen von 't' wird durch (.) im ersten Fall angepasst werden, so ([^']) im zweiten Fall bekommt nie eine Chance, es zu entsprechen. Diese leicht modifizierte Version könnte helfen:

line = re.sub(r"(?<!')'t'(?=.)", r"THIS_IS_TRUE", line) 

Diese Version verwendet Look-Ahead und Lookbehind-Syntax beschrieben here.

3

Wie wäre es

line = line.replace("'t'", "THIS_IS_TRUE").replace("'f'", "THIS_IS_FALSE") 

ohne re zu verwenden. Dies ersetzt alle Vorkommen von 't' und 'f'. Stellen Sie nur sicher, dass kein Auto t genannt wird.

+0

Danke, aber ich brauche etwas robuster als nur den Ersatz von 't' (und 'f'). – Snips

2

Die erste Übereinstimmung, die Sie sehen, ist ,'t',. Python beginnt mit dem nächsten Zeichen, das ist ' (vor dem zweiten t), anschließend kann es den ([^']) Teil nicht übereinstimmen und überspringt das zweite 't'.

Mit anderen Worten, nachfolgende Übereinstimmungen, die ersetzt werden sollen, können nicht überlappen.

0

re.sub(r"\bt\b","THIS_IS_TRUE",line) mit:

In [21]: strs="""INSERT INTO "cars" VALUES(56,'Bugatti Veyron','BUG 1',32,'t','t','2011-12-14 18:39:16.556916','2011-12-15 11:25:03.675058','81');""" 

In [22]: print re.sub(r"\bt\b","THIS_IS_TRUE",strs) 

INSERT INTO "cars" VALUES(56,'Bugatti Veyron','BUG 1',32,'THIS_IS_TRUE','THIS_IS_TRUE','2011-12-14 18:39:16.556916','2011-12-15 11:25:03.675058','81');