2012-11-21 66 views
0

我是Python新手,被卡在正則表達式替換上。我正在解析一個設置文件,其中包含以下語句:Python re.sub附加字符串,而不是替換它

set fmri(convolve7) 3 

設置文件被用作模板。該腳本通過模板進行解析並使用更新後的設置寫入新的設置文件。

我的方案的主要結構是

for line in infile: 
if condition = true 
    for each in listofelements 
    if re.search(each, line): 
    print(re.sub(r"\d+", "0", line), file=outfile, end='') # double output 
if re.search(somethingelse, line): 
    print(re.sub(templatesubid, i, line), file=outfile, end='')# normal substitution 

在取代用於在雙輸出,wheras外部for循環它簡化版,循環的結果。 for循環似乎用正確的替換字符串插入換行符,即

set fmri(convolve7) 0 
set fmri(convolve7) 3 

其他替換按預期工作,它們是相同的代碼。 for循環會導致這個double輸出嗎?

+2

您可以將該代碼修剪爲更簡潔的示例嗎? –

+0

這太長了......你不會得到答案......但re.sub確實取代了匹配......'print re.sub(「p +」,「b」,「Apple」)' –

+0

因爲這是python,'如果condition:'就足夠了,'if condition = true'將始終爲真(賦值而不是比較),我認爲應該是由於缺少冒號而導致的語法錯誤。無論哪種情況,您都會同時打印該打印聲明和第二個打印聲明。你可能需要一個或另一個。 – ernie

回答

1

它看起來像相關的代碼是在底部:

for line in infile: 
     if len(subparamlist) > 0: 
      for j in subparamlist: 
       query = j.replace(")", "\)").replace("(", "\(") 
       if re.search(query, line): 
        print(re.sub(r"\d+", "0", line), file=outfile, end='') #trouble! 
     if re.search(templatesubid, line) and re.search('feat_files\(', line) or re.search('\(custom', line) : # correct the subjectID 
      print(re.sub(templatesubid, i, line), file=outfile, end='') 
     elif re.search(str(nptslist[2]), line): # correct the number of timepoints 
      print(re.sub(str(nptslist[2]), str(nvols[0]), line), file = outfile, end='') 
     else: 
      print(line, file=outfile, end='') # if nothing to do, just copy the line to the new text file. 

我認爲問題是,你在這兩個頂部if報表打印(代0進線),然後重新打印在其下面的if/elif/else塊的其中一個分支中。這個結果是一些(或全部)行增加了一倍。

我實際上並沒有足夠的理解代碼來找出適當的修復方法,但可能的開始可能是將您已將「糾正subjectID」的if更改爲elif

+0

我將行改爲elif,但是我只得到:set fmri(con​​volve0)0 set fmri(con​​volve0)0作爲輸出。你的建議可以幫助我思考 - 所以非常快速的答覆感謝! – user1838663