Python-如何用连续的数字替换所有出现的子字符串并保存对主字符串的更改?

Python-如何用连续的数字替换所有出现的子字符串并保存对主字符串的更改?,python,string,python-2.7,Python,String,Python 2.7,我在txt文件中有一个字符串“companydocuments” 我需要计算给定字符串的所有出现次数,并用相应的连续数字替换它们 e、 g.'companydocuments'被找到405次,因此每个字符串必须是'companydocuments1','companydocuments2',依此类推,直到最后一个字符串(405)并将更改保存到文件中。 目的是在代码中进一步使用这些字符串作为参考,以进行或不进行某些操作。 我的代码运行不正常,但它总是以最后一个数字更改所有事件 e、 g.'comp

我在txt文件中有一个字符串“companydocuments”
我需要计算给定字符串的所有出现次数,并用相应的连续数字替换它们
e、 g.'companydocuments'被找到405次,因此每个字符串必须是'companydocuments1''companydocuments2',依此类推,直到最后一个字符串(405)并将更改保存到文件中。
目的是在代码中进一步使用这些字符串作为参考,以进行或不进行某些操作。
我的代码运行不正常,但它总是以最后一个数字更改所有事件
e、 g.'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
):

这将产生:

abc companydocuments1 xyz companydocuments2 def companydocuments3 123

您可以将
re.sub
与替换函数一起使用,替换函数将匹配项与计数器连接起来(使用
itertools.count
):

这将产生:

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()
函数,类似于string
split()
,只是如果将正则表达式放在括号中,则保留分隔符。因此,我利用这个特性生成一个令牌列表,这样其他每个令牌都是您感兴趣的字符串(您的是“COMPANYDOCUMENTS”,我的是“C”)。现在将其保存到列表中:

>>> tokens = re.split('(C)', a)
>>> tokens[1::2]
['C', 'C', 'C', 'C']
因此,我们希望通过添加一个序列号来修改此分隔符,这在Python中使用
enumerate()
和列表理解很容易:

>>> [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'

有一种更简单的方法可以做到这一点。首先,让我用一个字符串:

>>> a = "ABCHCYEQCUWC"
>>> import re
>>> re.split('(C)', a)
['AB', 'C', 'H', 'C', 'YEQ', 'C', 'UW', 'C', '']
re
模块有一个
split()
函数,类似于string
split()
,只是如果将正则表达式放在括号中,则保留分隔符。因此,我利用这个特性生成一个令牌列表,这样其他每个令牌都是您感兴趣的字符串(您的是“COMPANYDOCUMENTS”,我的是“C”)。现在将其保存到列表中:

>>> tokens = re.split('(C)', a)
>>> tokens[1::2]
['C', 'C', 'C', 'C']
因此,我们希望通过添加一个序列号来修改此分隔符,这在Python中使用
enumerate()
和列表理解很容易:

>>> [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

这不是最有效的方法,但有效:

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

你的代码很短,效果很好!我不明白只有这一部分,你能解释一下吗:
lambda m:m.group()+str(next(c)),
你的代码很短,效果很好!我不理解这一部分,你能解释一下吗:
lambda m:m.group()+str(next(c)),
如果你也能对你的代码做一个简短的解释会更好。如果你也能对你的代码做一个简短的解释会更好。