Вопрос о Python re.sub - PullRequest
       1

Вопрос о Python re.sub

15 голосов
/ 19 января 2010

Привет всем,

Я не уверен, возможно ли это, но я бы хотел использовать совпадающие группы в подстановке регулярных выражений для вызова переменных.

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 ]

26 голосов
/ 19 января 2010

Вы можете указать обратный вызов при использовании 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)

Также обратите внимание на дополнительное? в регулярном выражении. Вы хотите не жадное совпадение здесь.

Я понимаю, что это просто пример кода для иллюстрации концепции, но для приведенного вами примера лучше использовать простое форматирование строк.

8 голосов
/ 19 января 2010

Звучит как перебор.Почему бы просто не сделать что-то вроде

text = "find a replacement for me %(a)s and %(b)s"%dict(a='foo', b='bar')

?

2 голосов
/ 20 января 2010
>>> 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:]]'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...