Python:在字符串中计算彼此跟随的字符

时间:2016-08-18 09:42:09

标签: 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
MyString1_test04_edit0004
MyString1_test05_edit0005

假设#的数量不固定且rawString是仅包含string.ascii_letters + 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
                # ???

5 个答案:

答案 0 :(得分:2)

您可以在zfill替换中使用re.sub来填充任意数量的#块。 #+正则表达式模式匹配1个或多个#符号。 m.group()代表正则表达式找到的匹配项,因此,我们将所有#替换为递增的x转换为字符串,并填充相同数量的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

the demo的结果:

MyString1_test01_edit0001
MyString1_test02_edit0002
MyString1_test03_edit0003
MyString1_test04_edit0004
MyString1_test05_edit0005

答案 1 :(得分:1)

下面的代码将<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <configuration> <includes> <include>src/main/java/mockprocesses/itclient-counter/bin/main/TestCounter.java</include> </includes> </configuration> </plugin> 转换为格式字符串,在列表解析中使用rawString来查找哈希值组。每次运行的哈希都会转换为格式指令,以打印适当宽度的零填充整数,非哈希运行只需将它们连接在一起。

此代码适用于Python 2.6及更高版本。

groupby

<强>输出

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

答案 2 :(得分:0)

这个怎么样 -

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, )

答案 3 :(得分:0)

您可以尝试这种天真(可能不是最有效)的解决方案。它假定'#'的数量是固定的。

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

答案 4 :(得分:-2)

test_string = 'MyString1_test##_edit####'

def count_hash(raw_string):
    str_list = list(raw_string)
    hash_count = str_list.count("#") + 1
    for num in xrange(1, hash_count):
        new_string = raw_string.replace("####", "000" + str(num))
        new_string = new_string.replace("##", "0" + str(num))
        print new_string

count_hash(test_string)

它有点笨重,只适用于少于10的#计数,但似乎做你想要的。 编辑:“只有工作”我的意思是你会得到额外的字符与固定数量的#符号插入

EDIT2:修改后的代码