Iteration within re.sub()?

Robert Brewer fumanchu at amor.org
Mon Dec 13 22:05:15 EST 2004


Bryant Huang wrote:
> Is it possible to perform iteration within the re.sub() function call?
> 
> For example, if I have a string like:
> 
> str = "abbababbabbaaa"
> 
> and I want to replace all b's with an integer that increments from 0,
> could I do that with re.sub()?
> 
> Replacing b's with 0's is trivial:
> 
> i = 0
> pat = re.compile("b")
> print pat.sub(`i`, str)
> 
> Now, how can I increment i in each replacement? Is this 
> possible? Like,
> using a lambda function, for example? Or do I use a different re
> function altogether?
> 
> I use this trivial [ab]* language for simplicity, but I have a real
> problem where I need to match a more complex regex and replace it with
> an incrementing integer.

It's possible. Here's a quick, ugly version, which:

1. Uses a function for the "repl" arg of re.sub().
2. Uses a list to get around i being local inside of sub(). You could
just as well use the global statement.
3. Starts i[0] at -1. You could also use itertools.count or range to
good effect.

PythonWin 2.3.2 (#49, Oct  2 2003, 20:02:00) [MSC v.1200 32 bit (Intel)]
on win32.
>>> import re
>>> s = "abbababbabbaaa"
>>> i[0] = -1
>>> def sub(match):
... 	i[0] += 1
... 	return str(i[0])
... 
>>> re.sub("b", sub, s)
'a01a2a34a56aaa'


Robert Brewer
MIS
Amor Ministries
fumanchu at amor.org



More information about the Python-list mailing list