2013-02-18 39 views
2

我正在嘗試使用re.sub爲程序完成的所有文本替換創建報告。我無法弄清楚如何將替換的文本捕獲到變量中。你能幫助我嗎?請找到下面的代碼在Python中使用re.sub捕獲替換的文本

import re 

Report_file = open("report.txt", "w") 
st = '''<item><AP>item1</AP><AP>Item2</AP><AP>item3</AP><AP>Item4</AP></item>''' 

outval = re.sub(r'(?i)item1', "value1", st) 
outval = re.sub(r'(?i)item2', "value2", outval) 
outval = re.sub(r'(?i)item3', "value3", outval) 
print outval 

我想在下面的格式

OLD: item1 
NEW: value1 

OLD: item2 
NEW: value2 

OLD: item3 
NEW: value3 
+0

我張貼,沒有工作用更簡便的方法 – eyquem 2013-02-18 16:57:42

+0

你能不能,請告訴我,如果你看了我更好的解決答案嗎? – eyquem 2013-02-19 17:56:29

+0

@eyquem接受你的回答謝謝你給我簡單的解決方案。當你有機會時,請你幫我解決這個問題。 [鏈接](HTTP://計算器。com/questions/14957713 /編寫替換文本到外部文件) – 2013-02-19 19:57:00

回答

1

在你的問題和答案,你必須寫許多指令

outval = re.sub(r'(?i)item3', ..........) 

因爲有項目需要更換。

如果有56個項目要更換怎麼辦?

在我下面的解決方案中,有5個項目來代替,但是指令
r.sub(fruiting,text)被寫一次:

text = ''' 
OR 125 
BA 48 
Pr 12 
ba 4 
Cherry 147 
Ba 10 
Or 7 
OR 6 
Orange 2 
AP 9 
PR   3 
Banana 101 
or 22 
pR 13 
''' 

。 進口重新

the_items = ('OR','BA','AP','PR','CH') 
new_items = ('Orange','Banana','Apple','Pear','Cherry') 
corresp = dict(zip(the_items,new_items)) 

r = re.compile('(%s) *(\d+)' % '|'.join(the_items), 
       re.IGNORECASE) 

def fruiting(ma,longname = corresp): 
    fresh = '%-12s %s' % (longname[ma.group(1).upper()], 
          ma.group(2)) 
    tu = ('OLD: %r\n' 
      'NEW: %r\n' 
      % 
      (ma.group(),fresh)) 
    print tu 
    return fresh 

print '%s%s' % (text, r.sub(fruiting,text)) 

結果

OLD: 'OR 125' 
NEW: 'Orange  125' 

OLD: 'BA 48' 
NEW: 'Banana  48' 

OLD: 'Pr 12' 
NEW: 'Pear   12' 

OLD: 'ba 4' 
NEW: 'Banana  4' 

OLD: 'Ba 10' 
NEW: 'Banana  10' 

OLD: 'Or 7' 
NEW: 'Orange  7' 

OLD: 'OR 6' 
NEW: 'Orange  6' 

OLD: 'AP 9' 
NEW: 'Apple  9' 

OLD: 'PR   3' 
NEW: 'Pear   3' 

OLD: 'or 22' 
NEW: 'Orange  22' 

OLD: 'pR 13' 
NEW: 'Pear   13' 

OR 125 
BA 48 
Pr 12 
ba 4 
Cherry 147 
Ba 10 
Or 7 
OR 6 
Orange 2 
AP 9 
PR   3 
Banana 101 
or 22 
pR 13 

Orange  125 
Banana  48 
Pear   12 
Banana  4 
Cherry 147 
Banana  10 
Orange  7 
Orange  6 
Orange 2 
Apple  9 
Pear   3 
Banana 101 
Orange  22 
Pear   13 
4

您需要使用的功能,而不是替代模式,而不是報告文件:

def build_replacer(replacement): 
    def replace(match): 
     print match.group(), replacement 
     return replacement 
    return replace 

然後運行:

outval = re.sub(r'(?i)item1', build_replacer("value1"), st) 
outval = re.sub(r'(?i)item2', build_replacer("value2"), outval) 
outval = re.sub(r'(?i)item3', build_replacer("value3"), outval) 

,它將打印原始文本並且它是替代品。

這然後給出:

>>> st = '''<item><AP>item1</AP><AP>Item2</AP><AP>item3</AP><AP>Item4</AP></item>''' 
>>> outval = re.sub(r'(?i)item1', build_replacer("value1"), st) 
item1 value1 
>>> outval = re.sub(r'(?i)item2', build_replacer("value2"), outval) 
Item2 value2 
>>> outval = re.sub(r'(?i)item3', build_replacer("value3"), outval) 
item3 value3 
>>> outval 
'<item><AP>value1</AP><AP>value2</AP><AP>value3</AP><AP>Item4</AP></item>' 

除了打印,你也可以在其他地方存放,當然這些信息的。

build_replacer()函數只是返回一個新函數replace(),這是re.sub()每當它找到匹配時將使用的函數。它不是直接替換匹配的文本,而是要求函數使用什麼來替代文本。

我們在此使用build_replacer()作爲嵌套函數的原因是,我們可以將固定替換文本存儲在某個位置,並重復使用相同的替換函數,而無需對替換文本進行硬編碼。

+0

你好@Martijn。你能解釋一下這個函數是如何以及何時調用replace函數的?由於'build_replace'只是返回一個函數對象,所以我很難理解,在調用中如何使用它。 – 2013-02-18 15:03:51

+0

@RohitJain:添加了一個簡短的解釋。這是一個嵌套函數,使用範圍來存儲替換文本。 – 2013-02-18 15:06:09

+0

@Martijn彼得斯感謝您的回覆。它運行良好。但是,你能解釋一下這個功能嗎?你通過替換函數的輸入是什麼? – 2013-02-18 15:10:28