正则表达式替换%变量%

时间:2011-06-01 19:49:41

标签: python regex

我一直在把头发弄出30分钟做这个......

我有一本字典,如下:

{'search': 'replace',
 'foo':    'bar'}

这样的字符串:

Foo bar %foo% % search %.

我想用字典中的等效文本替换每个变量:

Foo bar bar replace.

我当前的正则表达式失败了,所以这里(keyvalue来自dictionary.items()):

 re.sub(r'%\d+' + key + '[^%]\d+%', value, text)

任何帮助都会受到赞赏,因为这个正则表达式的东西让我疯狂......

4 个答案:

答案 0 :(得分:8)

如果您对字符串中的语法很灵活,那么Python有一个内置的机制:

>>> print 'Hello, %(your_name)s, my name is %(my_name)s' % {'your_name': 'Blender', 'my_name': 'Ken'}
Hello, Blender, my name is Ken

或者,如果你想要这种语法,我会避免使用正则表达式,只需这样做:

>>> vars = {'search': 'replace',
...  'foo':    'bar'}
>>> mystring = "Foo bar %foo% % search %."
>>> for k, v in vars.items():
...     mystring = mystring.replace('%%%s%%' % k, v)
... 
>>> print mystring
Foo bar bar % search %.

答案 1 :(得分:4)

如果你想在一个语句中,你可以做以下(假设s是字符串,d是字典):

re.sub(r"[%]\s*[^%]+\s*[%]",lambda k:d.get(k[1,-1].strip(),k),s)

这使用替换部分中的函数从字典中获取每个值,并忽略它是否不在字典中。

编辑修复了查找密钥中出现不需要的空格的错误

答案 2 :(得分:2)

也许我错过了一些东西,但是下面的正则表达式不会起作用吗?

re.sub(r'%\s?' + key + '\s?%', value, text)

唯一有点特别的是可选空间;它们可与\s?匹配。

答案 3 :(得分:2)

使用re.sub的替换功能支持:

def replace(s, kw, pattern=re.compile(r'%\s*(\w+)\s*%')):
    """
    Replace delimited keys in a string with values from kw.

    Any pattern may be used, as long as the first group defines the lookup key.
    """
    lookup = lambda match: kw.get(match.group(1), match.group())
    return pattern.sub(lookup, s)

>>> replace('Foo bar %foo% % search %.', {'search': 'replace', 'foo': 'bar'})
'Foo bar bar replace.'

您可以更改lookup函数以自定义查找错误的处理方式,等等。