0

我正在读取一个文件,我需要替换某些空标签([[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 每行调用一次。

4

2 回答 2

3

您可以itertools.count在此处使用并利用这样一个事实,即在创建函数时计算默认参数,并且可变默认参数的值可以在函数调用之间保持不变。

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
于 2014-08-10T17:33:43.707 回答
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
于 2014-08-10T17:40:15.270 回答