在python中为每个正则表达式匹配附加后缀?

时间:2015-12-11 10:17:08

标签: python regex

我试图将“史密斯”附加到映射到精神动物的每个名字上。

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附加到所有名称的正则动物的正则表达式?

1 个答案:

答案 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+)':匹配该块内的名称。