我在txt文件中有一个字符串'companydocuments'。 我需要计算所有给定字符串的出现次数,并用相应的连续数字替换它们 例如找到'companydocuments'405次,因此每个字符串必须是'companydocuments1','companydocuments2',依此类推到最后一个(405)并保存对文件的更改。 目的是在代码中进一步使用这些字符串作为引用来进行或不进行某些操作。 我的代码不能很好地工作,但它总是用最后一个数字改变所有出现的代码 例如'companydocuments405'为每条记录,它不会保存任何文件。
#!/usr/bin/python
#Python 2.7.12
import re, os, string
with open('1.txt', 'r') as myfile:
lenght = myfile.read()
a = lenght.count('COMPANYDOCUMENTS')
a2 = re.findall('COMPANYDOCUMENTS', lenght)
for i in range(a):
string = 'COMPANYDOCUMENTS'
b = [string + str(i) for i in range(a)]
a2 = b[:]
a3 = str(a2)
content1 = lenght.replace('COMPANYDOCUMENTS', a3)
myfile = open('1.txt', 'w')
myfile.write(content1)
myfile.close()
您可以使用re.sub
替换函数将匹配与计数器连接(使用itertools.count
):
from itertools import count
import re
lenght = 'abc companydocuments xyz companydocuments def companydocuments 123'
c = count(1)
print(re.sub('companydocuments', lambda m: m.group() + str(next(c)), lenght))
这输出:
abc companydocuments1 xyz companydocuments2 def companydocuments3 123
有一种更简单的方法可以做到这一点。首先,让我去一个字符串:
>>> a = "ABCHCYEQCUWC"
>>> import re
>>> re.split('(C)', a)
['AB', 'C', 'H', 'C', 'YEQ', 'C', 'UW', 'C', '']
re
模块有一个split()
函数类似于字符串split()
,除了如果你把正则表达式放在括号中,你保留分隔符。所以我利用这个功能来生成一个令牌列表,这样每个其他令牌都是你感兴趣的字符串(你的是“COMPANYDOCUMENTS”,我的是“C”)。现在将其保存到列表中:
>>> tokens = re.split('(C)', a)
>>> tokens[1::2]
['C', 'C', 'C', 'C']
所以我们想通过附加一个序列号来修改这个分隔符,这在Python中很容易使用enumerate()
和list comprehension:
>>> [x+str(i+1) for i,x in enumerate(tokens[1::2])]
['C1', 'C2', 'C3', 'C4']
现在您可以替换标记化的字符串并重建输出字符串:
>>> tokens[1::2] = [x+str(i+1) for i,x in enumerate(tokens[1::2])]
>>> tokens
['AB', 'C1', 'H', 'C2', 'YEQ', 'C3', 'UW', 'C4', '']
>>> "".join(tokens)
'ABC1HC2YEQC3UWC4'
不是最有效的方式,但有效:
import string
readen = "sometext companydocument sometext companydocument ..."
delimiter = "companydocument"
result = ""
index = 0; # index will stay after every found of the delimiter
for i in readen.split(delimiter):
index += 1
# add the intermediate text (i), delimiter and index to the result
result += i + delimiter + str(index)
# after the last item of the splitted list is the delimiter with an index not needed
# so remove it
result = result[ 0: -( len(str(index)) + len(delimiter) ) ]
# now is "sometext companydocument1 sometext companydocument2 ..." stored in result