这个想法很简单。您使用描述不转换部分的正则表达式拆分字符串,然后仅转换其偶数部分,然后将它们连接回来。
>>> 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()