Question about re.sub and callables

  • Thread starter =?iso-8859-1?B?R3V5b24gTW9y6WU=?=
  • Start date
?

=?iso-8859-1?B?R3V5b24gTW9y6WU=?=

I have a function with some params including some data to be used with
re.sub and some other data which i want to use in the replacement.

I can provide re.sub with a callable, but this will only be called
with a match object, it's not possible to give it any of the other
params.

The solution I came up with to tackle this is with some funny globals,
which doesnt feel 'right':

--------------------------------------------------------------------------------------
import re

def test(data,pre,post):
p = re.compile("([0-9])")
global _pre, _post
_pre = pre
_post = post

def repl(m):
global _pre, _post
return _pre + m.group(1) + _post

print p.sub(repl, data)
number ->1<- test
--------------------------------------------------------------------------------------

Is there any other way to do this?

cheers,

Guyon Morée
http://gumuz.looze.net/
 
S

skip

Guyon> The solution I came up with to tackle this is with some funny
Guyon> globals, which doesnt feel 'right':

...

Guyon> Is there any other way to do this?

You've almost got it right. Just lose the "global":

def test(data, pre, post):
p = re.compile("([0-9])")

def repl(m):
return pre + m.group(1) + post

print p.sub(repl, data)

For a full explanation, google for "python nested scopes".

Skip
 
F

Fredrik Lundh

Guyon Morée said:
I can provide re.sub with a callable, but this will only be called
with a match object, it's not possible to give it any of the other
params.

The solution I came up with to tackle this is with some funny globals,
which doesnt feel 'right':

--------------------------------------------------------------------------------------
import re

def test(data,pre,post):
p = re.compile("([0-9])")
global _pre, _post
_pre = pre
_post = post

def repl(m):
global _pre, _post
return _pre + m.group(1) + _post

print p.sub(repl, data)

contemporary python (nested scopes):

def test(data,pre,post):
p = re.compile("([0-9])")
def repl(m):
return pre + m.group(1) + post
print p.sub(repl, data)

old python (object binding):

def test(data,pre,post):
p = re.compile("([0-9])")
def repl(m, pre=pre, post=post):
return pre + m.group(1) + post
print p.sub(repl, data)

</F>
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,744
Messages
2,569,480
Members
44,900
Latest member
Nell636132

Latest Threads

Top