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