使用python中的re.sub捕获替换的文本

时间:2013-02-18 14:49:15

标签: python regex python-2.7

我正在尝试使用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

2 个答案:

答案 0 :(得分: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()作为嵌套函数的原因是,我们可以将固定的替换文本存储在某处并反复使用相同的替换函数,而无需对替换文本进行硬编码。

答案 1 :(得分: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