アイデアはとてもシンプルです。変換しない部分を表す正規表現を使用して文字列を分割し、偶数部分のみを変換してから結合します。
>>> import re
>>> mylist=["$(ProjectDir)Dir1\Dest1","$(OutDir)Dir2\Dest2","$(IntDir)Dir2\Dest2"]
>>> print ["".join([s if i%2 else s.lower() for (i,s) in enumerate(re.split('(\$\([^)]*\))', x))]) for x in mylist]
['$(ProjectDir)dir1\\dest1', '$(OutDir)dir2\\dest2', '$(IntDir)dir2\\dest2']
ここでの主なことは次のとおりです。
[ "".join([
s if i%2 else s.lower()
for (i,s) in enumerate(re.split('(\$\([^)]*\))', x))])
for x in mylist ]
リストmylist
を調べて、x ごとに変更されたバージョンを生成します。
[ ... for x in mylist ]
x
次の操作を使用して、すべてを変換します。
"".join([
s if i%2 else s.lower()
for (i,s) in enumerate(re.split('(\$\([^)]*\))', x))]
つまり、文字列を変換する必要がある部分 (偶数) と変換しない部分 (奇数) に分割します。
例えば:
>>> re.split('(\$\([^)]*\))', x)
['', '$(ProjectDir)', 'Dir1\\Dest1']
それらを列挙し、すべての偶数部分を変換するよりも:
>>> print list(enumerate(re.split('(\$\([^)]*\))', x)))
[(0, ''), (1, '$(ProjectDir)'), (2, 'Dir1\\Dest1')]
一部が偶数または奇数の場合、これを使用してチェックしますif
。
s if i%2 else s.lower()