我试图将“史密斯”附加到映射到精神动物的每个名字上。
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
附加到所有名称的正则动物的正则表达式?
答案 0 :(得分: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)
正则表达式会释放spirit_animals
块(请注意它是(?s)spirit_animals\s*=\s*\{.*?};(?:$|\n)
正则表达式的展开版本)。 '(\w+)':
匹配该块内的名称。