我有这样的文件(这是一个简化版本):
james sfsf qef qef
qef qef qe fff
qqew james james qef
qefq ffgrsf wsef
qef james eq james
Run Code Online (Sandbox Code Playgroud)
我想用不同的值替换'james'的每次迭代.这是我在测试代码中的内容:
f=open('file_to_be_read.txt','r')
text=f.read()
matches=len(re.findall('james',text))
f.close()
number=0
for x in range(matches):
new_text=re.sub(r'james',str(number),text,count=1)
number+=1
r=open('result_file.txt','w')
r.write(new_text)
r.close()
Run Code Online (Sandbox Code Playgroud)
但它只是将第一个'james'替换为2.而不是产生我想要的以下结果:
1 sfsf qef qef
qef qef qe fff
qqew 2 3 qef
qefq ffgrsf wsef
qef 4 eq 5
Run Code Online (Sandbox Code Playgroud)
我想通过重复带有count = 1的re.sub,我每次都会替换1个詹姆斯但允许我更改替换值.
我建议使用itertools.count这个:
>>> from itertools import count
>>> import re
>>> s = '''james sfsf qef qef
qef qef qe fff
qqew james james qef
qefq ffgrsf wsef
qef james eq james'''
>>> print re.sub(r'james', lambda x, c=count(1): str(next(c)), s)
1 sfsf qef qef
qef qef qe fff
qqew 2 3 qef
qefq ffgrsf wsef
qef 4 eq 5
Run Code Online (Sandbox Code Playgroud)
这c=count(1)是一个默认参数值,它只计算一次(当创建函数对象时),对此函数的下一次调用将每次递增先前的计数.