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

2024-09-27 00:16:59 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在读取一个文件,需要替换某些空标记([[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]]

我试过使用一个替换函数,问题是这个函数每使用一行只被调用一次回复sub是的


Tags: 文件函数标记imageimportre替代品extension
2条回答

您可以在这里使用^{},并利用以下事实:创建函数时会计算默认参数,可变默认参数的值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

我将使用一个包装在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

相关问题 更多 >

    热门问题