re.sub not replacing all occurrences

前端 未结 4 1984

I\'m not a Python developer, but I\'m using a Python script to convert SQLite to MySQL

The suggested script gets close, but no cigar, as they say.

The line g

相关标签:
4条回答
  • 2021-01-02 02:26

    The two substitutions you'd want in your example overlap - the comma between your two instances of 't' will be matched by (.) in the first case, so ([^']) in the second case never gets a chance to match it. This slightly modified version might help:

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

    This version uses lookahead and lookbehind syntax, described here.

    0 讨论(0)
  • 2021-01-02 02:30

    How about

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

    without using re. This replaces all occurrences of 't' and 'f'. Just make sure that no car is named t.

    0 讨论(0)
  • 2021-01-02 02:30

    The first match you see is ,'t',. Python proceeds starting with the next character, which is ' (before the second t), subsequently, it cannot match the ([^']) part and skips the second 't'.

    In other words, subsequent matches to be replaced cannot overlap.

    0 讨论(0)
  • 2021-01-02 02:43

    using 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');
    
    0 讨论(0)
提交回复
热议问题