2012-11-13 45 views
5

我不是一個Python開發,但我使用Python腳本convert SQLite to MySQL應用re.sub沒有替換所有出現

建議的腳本靠攏,但沒有雪茄,因爲他們說。

行給我的一個問題是:

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

...提供虛假的等效線( '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'。

我很感激提示,爲什麼我只看到替換的第一個事件,謝謝。

回答

6

你想要在你的榜樣重疊的兩個換人 - 的't'你的兩個實例之間的逗號將被(.)在第一種情況下([^'])在第二種情況下匹配,所以從來沒有機會去匹配它。此稍作修改的版本可能會有所幫助:

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

這個版本使用先行和回顧後的語法,描述here

3

如何

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

不使用re。這將取代所有出現的't''f'。只要確保沒有車名爲t

+0

謝謝,但我需要的東西比't'(和'f')的全面替換更強大。 – Snips

2

你看到的第一場比賽是,'t',。 Python從下一個字符開始,它是'(在第二個t之前),隨後它不能匹配([^'])部分並跳過第二個't'

換句話說,後續的被替換的匹配不能重疊。

0

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