17

私はPython開発者ではありませんが、Pythonスクリプトを使用してSQLiteをMySQLに変換しています

彼らが言うように、提案されたスクリプトは近づきますが、葉巻はありません。

私に問題を与える行は次のとおりです。

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

...もちろん、false('f')の同等の行と一緒に。

私が見ている問題は、特定の行で最初に出現する「t」のみが置き換えられることです。

したがって、スクリプトに入力すると、

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'のすべての出現を置き換える必要があることを理解しています。

おかげで、最初のオカレンスだけが置き換えられるのを見る理由についてのヒントをいただければ幸いです。

4

4 に答える 4

11

この例で必要な2つの置換は重複しています。最初のケースでは、の2つのインスタンス間のコンマ't'が一致する(.)ため([^'])、2番目のケースでは一致する機会がありません。このわずかに変更されたバージョンが役立つ場合があります。

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

このバージョンでは、ここで説明する先読み構文と後読み構文を使用します。

于 2012-11-13T15:30:43.787 に答える
3

どうですか

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

を使用せずにre't'これは、とのすべての出現を置き換えます'f'。名前の付いた車がないことを確認してtください。

于 2012-11-13T15:25:07.543 に答える
2

表示される最初の一致はです,'t',。Pythonは、次の文字'(2番目の文字の前t)から開始し、その後、その部分と一致できず、 2番目の文字([^'])をスキップし't'ます。

つまり、置き換えられる後続の一致は重複できません。

于 2012-11-13T15:29:08.983 に答える
1

使用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');
于 2012-11-13T15:29:31.883 に答える