Python re.sub问题

时间:2010-01-19 16:20:40

标签: python regex

问候所有人,

我不确定这是否可行,但我想在正则表达式替换中使用匹配的组来调用变量。

a = 'foo'
b = 'bar'

text = 'find a replacement for me [[:a:]] and [[:b:]]'

desired_output = 'find a replacement for me foo and bar'

re.sub('\[\[:(.+):\]\]',group(1),text) #is not valid
re.sub('\[\[:(.+):\]\]','\1',text) #replaces the value with 'a' or 'b', not var value

想法?

3 个答案:

答案 0 :(得分:26)

使用可以访问组的re.sub时,可以指定回调: http://docs.python.org/library/re.html#text-munging

a = 'foo'
b = 'bar'

text = 'find a replacement for me [[:a:]] and [[:b:]]'

desired_output = 'find a replacement for me foo and bar'

def repl(m):
    contents = m.group(1)
    if contents == 'a':
        return a
    if contents == 'b':
        return b

print re.sub('\[\[:(.+?):\]\]', repl, text)

还要注意额外的?在正则表达式中。你想在这里进行非贪婪的匹配。

我知道这只是用来说明概念的示例代码,但是对于您给出的示例,简单的字符串格式化更好。

答案 1 :(得分:8)

听起来有点矫枉过正。为什么不做一些像

这样的事情
text = "find a replacement for me %(a)s and %(b)s"%dict(a='foo', b='bar')

答案 2 :(得分:2)

>>> d={}                                                
>>> d['a'] = 'foo'                                      
>>> d['b'] = 'bar' 
>>> text = 'find a replacement for me [[:a:]] and [[:b:]]'
>>> t=text.split(":]]")
>>> for n,item in enumerate(t):
...   if "[[:" in item:
...      t[n]=item[: item.rindex("[[:") +3 ] + d[ item.split("[[:")[-1]]
...
>>> print ':]]'.join( t )
'find a replacement for me [[:foo:]] and [[:bar:]]'