正则表达式仅仅是特定的命中序列

时间:2015-08-28 13:34:52

标签: python regex split substitution

我有多个字符串变体:"gr_shoulder_r_tmp""r_shoulder_tmp" 我需要替换:

“r _” l _ ,此处:

"gr_shoulder_r_tmp" > "gr_shoulder_l_tmp"
"r_shoulder_tmp" > "l_shoulder_tmp"
换句话说,我需要在第一个例子中提升第三个硬币 搅拌的第二个例子中的第一个

我开始挖自己...... 并得出了半结果的结果,这带来了一个更有趣的问题:

  

a)找到正确命中的索引

[i for i, x in enumerate(re.findall("(.?)(r_)", "gr_shoulder_r_tmp")) if filter(None, x).__len__() == 1] 这给了我indx = 2

  

?)如何使用该命中索引:[

虽然写了这个我发现直接简单的解决方案..

  

b)按下划线拆分,替换独立字母,然后加入

findtag = "r"
newtag = "l"
itemA = "gr_shoulder_r_tmp"
itemB = "r_shoulderr_tmp"
spl_str = itemA.split("_")
hit = spl_str.index(findtag)
spl_str[hit] = newtag
new_item = "_".join(spl_str)

itemAitemB都给了我所需要的东西..但我不高兴,太沉重和粗暴

1 个答案:

答案 0 :(得分:2)

一个简单的正则表达式将完成这项工作。

re.sub(r'(?<![a-zA-Z])r_', 'l_', s)

(?<![a-zA-Z])负面的背后隐藏,声称匹配将在任何但不是字母之前。

示例:

>>> re.sub(r'(?<![a-zA-Z])r_', 'l_',"gr_shoulder_r_tmp")
'gr_shoulder_l_tmp'
>>> re.sub(r'(?<![a-zA-Z])r_', 'l_',"r_shoulder_tmp")
'l_shoulder_tmp'