2015-08-28 2 views
0

У меня есть несколько вариантов строки: "gr_shoulder_r_tmp", "r_shoulder_tmp" мне нужно заменить:регулярное выражение sbustitute только определенная последовательность хит

"r_" к l_, здесь:

"gr_shoulder_r_tmp" > "gr_shoulder_l_tmp" 
"r_shoulder_tmp" > "l_shoulder_tmp" 

другими словами мне нужно подождать 3-го совпадения в примере frist и 1-го по второму примеру перемешивания

им начал копать себе ... и пришел в halfesolved результат, который носил еще один интересный вопрос:

а) Найти индекс справа ударил

[i for i, x in enumerate(re.findall("(.?)(r_)", "gr_shoulder_r_tmp")) if filter(None, x).__len__() == 1] , который дает мне indx = 2

) как использовать этот хит индекс: [

в то время как писал я нашел простое решение прямой ..

б) разбивка по подчеркиванием, заменить отдельную букву, и присоединиться обратно

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) 

как itemA, itemB дает мне то, что мне нужно .. но я не доволен этим, слишком тяжелым и таким грубым

ответ

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' 
+0

здорово! Ты много Авинаш Радж. Можете ли вы объяснить, что это делает? (? bafly

+0

У меня тоже было заменено, если у меня есть' gr_shoulderr_r_tmp' -rr_ ... о, я плохой .. я забыл удалить^(cap) из письма pattens – bafly

+0

Это называется негативный взгляд на утверждение, как вы можете видеть в [документации] (https://docs.python.org/3.5/library/re.html#regular-expression-syntax). Важно, чтобы вы это поняли, потому что вам может потребоваться настроить условие. –

Смежные вопросы