我正在读取文件,我需要替换某些空标签([[Image:]])。
问题是每次更换都必须是独一无二的。
以下是代码:
import re
import codecs
re_imagematch = re.compile('(\[\[Image:([^\]]+)?\]\])')
wf = codecs.open('converted.wiki', "r", "utf-8")
wikilines = wf.readlines()
wf.close()
imgidx = 0
for i in range(0,len(wikilines)):
if re_imagematch.search(wikilines[i]):
print 'MATCH #######################################################'
print wikilines[i]
wikilines[i] = re_imagematch.sub('[[Image:%s_%s.%s]]' % ('outname', imgidx, 'extension'), wikilines[i])
print wikilines[i]
imgidx += 1
这不起作用,因为一行中可以有许多标记:
这是输入文件。
[[Image:]][[Image:]]
[[Image:]]
这就是输出的样子:
[[Image:outname_0.extension]][Image:outname_1.extension]]
[[Image:outname_2.extension]]
这就是它目前的样子
[[Image:outname_0.extension]][Image:outname_0.extension]]
[[Image:outname_1.extension]]
我尝试使用替换函数,问题是这个函数只使用re.sub。每行调用一次。
答案 0 :(得分:3)
你可以在这里使用itertools.count
并利用这一事实,即在创建函数时计算默认参数,并且可变默认参数的值can persist between function calls.
from itertools import count
def rep(m, cnt=count()):
return '[[Image:%s_%s.%s]]' % ('outname', next(cnt) , 'extension')
此函数将针对找到的每个匹配进行调用,并且每次替换都会使用新值。
因此,您只需在代码中更改此行:
wikilines[i] = re_imagematch.sub(rep, wikilines[i])
<强>演示:强>
def rep(m, count=count()):
return str(next(count))
>>> re.sub(r'a', rep, 'aaa')
'012'
获取当前计数器值:
>>> from copy import copy
>>> next(copy(rep.__defaults__[0])) - 1
2
答案 1 :(得分:1)
我使用包裹在while
循环中的简单字符串替换:
s = '[[Image:]][[Image:]]\n[[Image:]]'
pattern = '[[Image:]]'
i = 0
while s.find(pattern) >= 0:
s = s.replace(pattern, '[[Image:outname_' + str(i) + '.extension]]', 1)
i += 1
print s