Python:计算字符串中相互跟随的字符数

Python:计算字符串中相互跟随的字符数,python,string,Python,String,我有一个字符串,我想在其中计算紧随其后的#的出现次数,用数字替换它们以创建增量 例如: rawString = 'MyString1_test##_edit####' for x in xrange(5): output = doConvertMyString(rawString) print output MyString1_test01_edit0001 MyString1_test02_edit0002 MyString1_test03_edit0003 MyStrin

我有一个字符串,我想在其中计算紧随其后的
#
的出现次数,用数字替换它们以创建增量

例如:

rawString = 'MyString1_test##_edit####'

for x in xrange(5):
    output = doConvertMyString(rawString)
    print output

MyString1_test01_edit0001
MyString1_test02_edit0002
MyString1_test03_edit0003
MyString1_test04_edit0004
MyString1_test05_edit0005
假设
#
的数量不是固定的,并且
rawString
是只包含
string.ascii_字母+string.digits+'.''+'.
的用户输入,我该怎么做

以下是我目前的测试:

rawString = 'MyString1_test##_edit####'
incrDatas = {}
key = '#'
counter = 1

for x in xrange(len(rawString)):
    if rawString[x] != key:
        counter = 1
        continue
    else:
        if x > 0:
            if rawString[x - 1] == key:
                counter += 1
            else:
                pass
                # ???
它有点笨重,只适用于少于10次的计数,但似乎可以做你想做的事情。 编辑:我所说的“仅有效”是指插入固定数量的#符号后,您将获得额外的字符

编辑2:修改代码

这个怎么样-

rawString = 'MyString1_test##_edit####'
splitString = rawString.split('_')

for i in xrange(10): # you may put any count
    print '%s_%s%02d_%s%04d' % (splitString[0], splitString[1][0:4], i, splitString[2][0:4], i, )
您可以尝试这种简单(可能不是最有效)的解决方案。它假定
“#”
的数量是固定的

rawString = 'MyString1_test##_edit####'

for i in range(1, 6):
    temp = rawString.replace('####', str(i).zfill(4)).replace('##', str(i).zfill(2))
    print(temp)

>> MyString1_test01_edit0001
   MyString1_test02_edit0002
   MyString1_test03_edit0003
   MyString1_test04_edit0004
   MyString1_test05_edit0005

您可以在
re.sub
replacement中使用
zfill
填充任意数量的
#+
regex模式匹配一个或多个
#
符号。
m.group()
代表正则表达式找到的匹配项,因此,我们用递增的
x
替换所有
s,转换为字符串,填充的
0
s数量与匹配项中的
数量相同

import re
rawString = 'MyString1_test##_edit####'
for x in xrange(5):
    output = re.sub(r"#+", lambda m: str(x+1).zfill(len(m.group())),  rawString)
    print output
结果:


下面的代码将
rawString
转换为格式字符串,在列表理解中使用
groupby
查找哈希组。每次运行的散列都会转换为一个format指令,以打印一个适当宽度的零填充整数,而非散列的运行只需重新连接在一起

此代码适用于Python2.6及更高版本

from itertools import groupby

def convert(template):
    return ''.join(['{{x:0{0}d}}'.format(len(list(g))) if k else ''.join(g)
        for k, g in groupby(template, lambda c: c == '#')])

rawString = 'MyString1_test##_edit####'
fmt = convert(rawString)
print(repr(fmt))

for x in range(5):
    print(fmt.format(x=x))
输出

'MyString1_test{x:02d}_edit{x:04d}'
MyString1_test00_edit0000
MyString1_test01_edit0001
MyString1_test02_edit0002
MyString1_test03_edit0003
MyString1_test04_edit0004

问题是什么?您没有提供
doConvertMyString
函数的详细信息,这是因为您没有尝试编写它吗?数字是动态的还是固定的?是否可以有两个以上的
#
符号块?是的,它是完全动态的,事实上
rawString
是一个用户输入,它只能包含
string.ascii_字母+string.digits+'''+'.'
实际上不包含。在第二次迭代中,没有要替换的
“#”
from itertools import groupby

def convert(template):
    return ''.join(['{{x:0{0}d}}'.format(len(list(g))) if k else ''.join(g)
        for k, g in groupby(template, lambda c: c == '#')])

rawString = 'MyString1_test##_edit####'
fmt = convert(rawString)
print(repr(fmt))

for x in range(5):
    print(fmt.format(x=x))
'MyString1_test{x:02d}_edit{x:04d}'
MyString1_test00_edit0000
MyString1_test01_edit0001
MyString1_test02_edit0002
MyString1_test03_edit0003
MyString1_test04_edit0004