我正在尝试使用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 :(得分: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