簡體   English   中英

帶有替換功能的 Python 替換

[英]Python substitution with replacement function

我有一個包含一些 SQL 的文件,例如:

INSERT INTO table (ID, Name) VALUES (1, 'a');
INSERT INTO table (ID, Name) VALUES (2, 'b');
...
INSERT INTO table (ID, Name) VALUES (1000, 'all');

我想在文件中用 1000 增加所有ID值,以獲得:

INSERT INTO table (ID, Name) VALUES (1001, 'a');
INSERT INTO table (ID, Name) VALUES (1002, 'b');
...
INSERT INTO table (ID, Name) VALUES (2000, 'all');

我寫了以下 Python 代碼

import os, re
root = r'path\to\dir'
path = os.path.join(root, 'original.sql')
new =  os.path.join(root, 'new.sql')

def increment(n, base=1000):
    return str(int(n.group(1)) + base)

with open(path) as f, open(new, 'w') as g:
    for line in f:
        line = re.sub('.*VALUES \((\d{1,4}),.*', increment, line)
        g.write(line)

但這只是輸出增加的值而不是進行替換。 我究竟做錯了什么?

將您的正則表達式更改為:

def fix_line(n, base=1000):
    return n.group(1) + str(int(n.group(2)) + base) + n.group(3)

line = re.sub('(.*VALUES \()(\d{1,4})(,.*)', fix_line, line)

所以如果你有line = "INSERT INTO table (ID, Name) VALUES (1001, 'a');" 開始,然后在您的正則表達式替換之后,您將擁有:

line = "INSERT INTO table (ID, Name) VALUES (2001, 'a');"

基本上,您需要捕獲數字之前的內容和數字之后的內容,並將其包含在您對每一行的處理中。

我應該補充一點,您不需要.*在正則表達式的開頭和結尾。 它也適用於line = re.sub('(VALUES \\()(\\d{1,4})(,)', fix_line, line)雖然這次你只匹配line一小部分,特別是VALUES (1001,然后僅在其上應用替換函數並保持字符串的其他部分不變。(您的原始正則表達式匹配整行並重新生成它。)。

你也可以這樣做

def iterate_number(n, base=1000):
    return "VALUES (%d," % (int(n.group(1)) + base)

line = re.sub('VALUES \((\d{1,4}),', iterate_number, line)

它只有一個匹配的組(數字),並且只是在字符串處理中添加了VALUES (數字之前,和數字之后的逗號。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM