2015-12-11 2 views
1

Я пытаюсь добавить «Смит» к каждому имени, сопоставленному с животным-духом.Добавить суффикс для каждого регулярного выражения в python?

import re 

contents = ''' 
    var cool_spirit_animals = { 
    'Abel': 'unicorn', 
    'Bob': 'lion' 
    }; 

    var spirit_plants = { 
    'Cain': 'venus fly trap' 
    }; 

    var stupid_spirit_animals = { 
    'Dan': 'lamprey' 
    }; 

    var spirit_vampires = { 
    'Emily': 'Buffy', 
    'Fred': 'Dracula' 
    }; 
''' 

my_regex = r'(spirit_animals = \{[\n\r\s]*\'\w+)(\': [^\}]*)' 
print re.sub(my_regex, r'\1 Smith\2', contents) 

, но мое регулярное выражение меняет имя при каждом отображении животных. Сценарий печатает:

var cool_spirit_animals = { 
    'Abel Smith': 'unicorn', 
    'Bob': 'lion' 
    }; 

    var spirit_plants = { 
    'Cain': 'venus fly trap' 
    }; 

    var stupid_spirit_animals = { 
    'Dan Smith': 'lamprey' 
    }; 

    var spirit_vampires = { 
    'Emily': 'Buffy', 
    'Fred': 'Dracula' 
    }; 

«Боб» не изменился - изменился только «Абель». Как написать регулярное выражение, которое добавляет Smith в все имена с духовыми животными?

ответ

2

Вы можете сначала соответствовать spirit_animal блок, а затем добавить Smith к именам внутри метода обратного вызова в re.sub:

def repl(m): 
    return re.sub(r"'(\w+)':", r"'\1 Smith':", m.group()) 

my_regex = r'spirit_animals\s*=\s*\{[^}]*(?:}(?!;(?:$|\n))[^}]*)*};(?:$|\n)' 
print re.sub(my_regex, repl, contents) 

Смотрите code demo

spirit_animals\s*=\s*\{[^}]*(?:}(?!;(?:$|\n))[^}]*)*};(?:$|\n) регулярное выражение exatracts в spirit_animals блок (обратите внимание на его это развернутая версия (?s)spirit_animals\s*=\s*\{.*?};(?:$|\n) regex). '(\w+)': соответствует именам внутри этого блока.

+1

Я никогда не знал, что 'sub' взял обработчик для каждого матча. Спасибо! –

+1

Давайте жить и учиться :). На самом деле это хороший способ обхода для оператора '\ G', отсутствующего в регулярном выражении Python. –

+0

Мне любопытно, что вы подразумеваете под этим. '\ G' фиксирует совпадение в perl, правильно? Как разрешить обработчик имитировать '\ G'? –

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