2017-11-19 12 views
1

私は、次の入力があります。私は、入力としてリストのリストを持っている場合は、どのように私はこれで連続1に初期化するカウンタを追加することができ、次の出力Pythonのカッコ内に文字を追加するにはどうすればよいですか?

[ [ A(x1)|B(x1,y1)|C(z1)'],['A(x2,y2)|B(John,y2)|C(z2)' ] ] 

をしたい

[ [ 'A(x)|B(x,y)|C(z)'],['A(x,y)|B(John,y)|C(z)' ] ] 

を方法?

+0

入力配列に3つの要素があり、2番目の要素にxが含まれていない場合、3番目の要素のxは 'x2'か' x3'ですか? –

+0

@RafaelBarros 3番目の要素のxはx3になります。カウンターはすべてのリストにかかわらずインクリメントされます –

答えて

2

リストのリストなので、リストの理解度、enumerate、regexを使用する必要があります。メインリスト上

>>> import re 
>>> x = [ [ 'A(x)|B(x,y)|C(z)'],['A(x,y)|B(John,y)|C(z)' ] ] 
>>> [[re.sub(r'([xyz])', r'\g<1>{}'.format(i+1), k) for k in j] for i,j in enumerate(x)] 
[['A(x1)|B(x1,y1)|C(z1)'], ['A(x2,y2)|B(John,y2)|C(z2)']] 
------ 
>>> x = [ [ 'A(x)|B(x,y)|C(z)', 'B(x,y)'],['A(x,y)|B(John,y)|C(z)' ], ['A|B'], ['A(x,y)|B(John,y)|C(z)'] ] 
>>> [[re.sub(r'([xyz])', r'\g<1>{}'.format(i), k) for k in j] for i,j in enumerate(x, 1)] 
[['A(x1)|B(x1,y1)|C(z1)', 'B(x1,y1)'], ['A(x2,y2)|B(John,y2)|C(z2)'], ['A|B'], ['A(x4,y4)|B(John,y4)|C(z4)']] 

反復は、その後、サブリストを反復処理し、その後一致と交換サブリスト内に存在各列(xまたはyまたはzの次のインデックス番号を追加します)。

+0

ありがとうトン! –

1

Pythonコード

私は個人的には、このために正規表現を使用すると思います。 re.subは、別の文字列(\g<1>のような正規表現マークアップを含む)に文字列を置き換えます。

あなたの完全なコードを作る
re.sub("(?<!\w)([xyz])",r"\g<1>2",before) 

import re 

before = "[ [ 'A(x)|B(x,y)|C(z)'],['A(x,y)|B(John,y)|C(z)' ] ]" 
print(re.sub("(?<!\w)([xyz])",r"\g<1>2",before)) 

正規表現の説明

(?<!\w)([xyz]) 

我々はそれが単語の一部ではないことを確認するの背後にある負の表情をしています、 (?<!\w)。次に、希望の変数名である([xyz])を確認します。それがこのパターンに従った場合、我々はに置き換えます

\g<1>2 

私たちが望むようPythonが\12を解釈しませんので、私は\g<1>の代わり\1を使用。これは、正規表現グループ12の代わりに、正規表現グループ1の代わりに数字2を表示します。

Regex101は、regexを理解するための素晴らしいツールです。どのように動作するかを見るにはリンクをクリックしてください。

関連する問題