3

我正在尝试为程序使用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
4

2 回答 2

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()在这里用作嵌套函数的原因是,我们可以将固定的替换文本存储在某个地方,并一遍又一遍地重复使用相同的替换函数,而无需对替换文本进行硬编码。

于 2013-02-18T14:52:22.480 回答
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
于 2013-02-18T16:31:19.673 回答