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

Python:用唯一替换替换字符串,python,regex,string,string-substitution,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(

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

您可以在这里使用,并利用以下事实,即创建函数时会计算默认参数,并且会计算可变默认参数的值

此函数将为找到的每个匹配项调用,并为每个替换项使用新值

因此,您只需更改代码中的这一行:

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

此函数将为找到的每个匹配项调用,并为每个替换项使用新值

因此,您只需更改代码中的这一行:

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:]]
模式=“[[Image:]”
i=0
当s.find(pattern)>=0时:
s=s.replace(模式“[[Image:outname_'+str(i)+'.extension]]”,1)
i+=1
印刷品

我会在
循环中使用一个简单的字符串替换:

s='[[Image:][[Image:]]\n[[Image:]]
模式=“[[Image:]”
i=0
当s.find(pattern)>=0时:
s=s.replace(模式“[[Image:outname_'+str(i)+'.extension]]”,1)
i+=1
印刷品

@AshwiniChaudhary尽管当前计数器值有效,但封装在一个类中可能会更容易,该类会公开以前生成的值的属性。。。虽然-这是一个相当多的工作:p@AshwiniChaudhary尽管当前计数器值可以工作,但封装在一个类中可能更容易,该类公开了先前生成的值的属性。。。尽管-这是一个相当多的工作:pSince我不是Python方面的专家,这里的人也不需要理解这一点,我接受你的答案。谢谢。因为我不是Python方面的专家,这里的人也不必理解这一点,所以我接受你的答案。谢谢