Python:用唯一替换替换字符串

时间:2014-08-10 17:25:34

标签: python regex string string-substitution

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

2 个答案:

答案 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