2016-08-18 10 views
1

文字列に数字を代入してインクリメントを作成する文字列を#の後に続けています。例えばPython:互いに続く文字列の文字を数えよう

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 
       # ??? 
+0

そして、質問は何ですか? –

+0

あなたは 'doConvertMyString'関数の詳細を提供していません、それはあなたがそれを書こうとしなかったからです? – Andrew

+0

'#'は動的か固定ですか? 2つ以上の '# '記号の塊がありますか? –

答えて

2

あなたはパッドに#チャンクの任意の量をre.sub交換でzfillを使用することができます。 #+正規表現パターンは1つ以上の#シンボルに一致します。 m.group()は、正規表現で見つかった一致を表しています。したがって、#のすべてを、0と同じ量の文字列に変換されたインクリメントされたxに置き換えます。一致するものは#です。

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

完璧に動作します、ありがとう! – UKDP

-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未満の#カウントのために動作しますが、あなたがやりたいようです。 EDIT:改正コード

+3

のみを含むことができるユーザー入力です。実際にはありません。 2番目の反復では、置き換えるための ''# ''はありません。 – DeepSpace

+1

良い点。おっと、 – Andrew

0

どうthis-

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

することができますについて:「のみ動作します」と私はあなたが

EDIT2挿入#記号の固定数で余分な文字を取得しますことを意味しますこの単純な(おそらく最も効率的ではない)ソリューションを試してみてください。 '#'の数が固定されていることを前提としています。

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 
1

次のコードは、ハッシュのグループを見つけるために、リスト内包でgroupbyを使用して、フォーマット文字列にrawStringを変換します。各ハッシュの実行は、適切な幅の0で埋め込まれた整数を出力するためのフォーマット・ディレクティブに変換され、非ハッシュの実行は単純に一緒に再び結合されます。

このコードは、Python 2.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 
関連する問題