2015-10-04 3 views
2

У меня есть вопрос из 2 частей. В конечном счете, я пытаюсь найти любую строку, содержащуюся в $"", с regex, а затем заменить ее на значение из словаря. Вот что у меня есть:Regex найти и заменить на словарь

import re 

# Dictionary to use to replace with later 
myDict = {'hand_R_item':'hand_R_node', 'hand_L_item':'hand_L_node', 'hips_item':'hips_node', 'body_item':'body_node'} 

# String to process 
command = '''objs = [$"hand_R_item", $"hand_L_item", $"hips_item"] 
for obj in objs: 
    cmds.select(add = True) 
    cmds.parent(obj, $"body_item") 
''' 

# Find all instances of anything matching $"" 
regex = re.compile(r'\$\"[\w]*?\"') 
allMatches = re.findall(regex, command) 

# Replace matches with values from dict 
newCommand = command 
for match in allMatches: 
    newCommand = newCommand.replace(match, myDict.get(match[2:-1], '')) 
print newCommand 

Это выведет следующее, что и хотят:

'objs = [hand_R_node, hand_L_node, hips_node] 
for obj in objs: 
    cmds.select(add = True) 
    cmds.parent(obj, body_node)' 

Мои вопросы в основном, чтобы увидеть, если я подхожу это правильный путь:

  1. r'\$\"[\w]*?\"' лучший образец для использования? Мне не нравятся регулярные выражения, поэтому я не знаю, не хватает ли я каких-либо подводных камней!
  2. Есть ли более эффективный способ заменить все вместо того, чтобы перебирать результаты регулярного выражения? Я чувствую, что может быть более элегантный подход.
+1

Почему бы просто не использовать 're.sub()'? –

+0

Это может быть именно то, что мне нужно, но я не самый знакомый с 're', вы можете показать мне быстрый пример? –

+0

Хорошо, позвольте мне выслать ответ :) –

ответ

1

Здесь вы можете использовать re.sub. Кроме того, в вашем регулярном выражении вам не нужно избегать кавычек. И \w может быть вне класса символов:

>>> d = {'hand_R_item':'hand_R_node', 'hand_L_item':'hand_L_node', 'hips_item':'hips_node', 'body_item':'body_node'} 
>>> reg = re.compile(r'\$"(\w*?)"') 
>>> command = '''objs = [$"hand_R_item", $"hand_L_item", $"hips_item"] 
... for obj in objs: 
...  cmds.select(add = True) 
...  cmds.parent(obj, $"body_item") 
... ''' 
>>> 
>>> # Replace the group 1, with corresponding value from dict 
>>> reg.sub(lambda m: d[m.group(1)], command) 
'objs = [hand_R_node, hand_L_node, hips_node]\nfor obj in objs:\n cmds.select(add = True)\n cmds.parent(obj, body_node)\n' 
>>> 
+0

Это сбой, если в строке есть значение, которое не находится в клавишах словаря. Например, смена первой строки на 'objs = [$" hand_R_item ", $" hand_L_item ", $" hips_item ", $" test "]' не удастся. Кажется, это правильная идея, мне просто нужно добавить проверку состояния. –

+1

@GreenCell Затем используйте 'd.get (m.group (1), m.group())' –

+0

^Это должно работать нормально. Спасибо Рохит. –

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