Не заменяет все вхождения
Я не разработчик 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');