Python:用唯一替换替换字符串
我正在读取一个文件,需要替换某些空标记([[Image:]) 问题是每次更换都必须是独一无二的 代码如下: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(
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方面的专家,这里的人也不必理解这一点,所以我接受你的答案。谢谢