Не заменяет все вхождения

Я не разработчик Python, но я использую Python script для конвертировать SQLite в MySQL

Предлагаемый script приближается, но не сигары, как говорится.

Линия, которая вызывает у меня проблему:

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

... вместе с эквивалентной линией для false ('f'), конечно.

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

Итак, ввод в script,

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');

... дает...

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');

Я упомянул, что я не разработчик Python, но я попытался исправить это сам. Согласно документации, я понимаю, что re.sub должен заменить все вхождения 't'.

Я был бы признателен за то, что я вижу только первое замещение, спасибо.

Ответ 1

Две замены, которые вы хотите в вашем примере, перекрываются - запятая между двумя экземплярами 't' будет соответствовать (.) в первом случае, поэтому ([^']) во втором случае никогда не будет сравните его. Эта слегка измененная версия может помочь:

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

В этой версии используется синтаксис lookahead и lookbehind, описанный здесь.

Ответ 2

Как насчет

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

без использования re. Это заменяет все вхождения 't' и 'f'. Просто убедитесь, что ни один автомобиль не назван t.

Ответ 3

Первое совпадение - ,'t',. Питон начинается со следующего символа, который равен ' (до второго t), впоследствии он не может соответствовать части ([^']) и пропускает второй 't'.

Другими словами, последующие совпадения, которые нужно заменить, не могут перекрываться.

Ответ 4

с помощью re.sub(r"\bt\b","THIS_IS_TRUE",line):

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');