reusing parts of a string in RE matches?
Fredrik Lundh
fredrik at pythonware.com
Fri May 12 04:48:25 EDT 2006
Mirco Wahab wrote:
> In Python, you have to deconstruct
> the 2D-lists (here: long list of
> short lists [a,2] ...) by
> 'slicing the slice':
>
> char,num = list[:][:]
>
> in a loop and using the apropriate element then:
>
> import re
>
> t = 'a1a2a3Aa4a35a6b7b8c9c';
> r = r'(\w)(?=(.)\1)'
> l = re.findall(r, t)
>
> for a,b in (l[:][:]) : print b
>
> In the moment, I find this syntax
> awkward and arbitary, but my mind
> should change if I'm adopted more
> to this in the end ;-)
in contemporary Python, this is best done by a list comprehension:
l = [m[1] for m in re.findall(r, t)]
or, depending on what you want to do with the result, a generator
expression:
g = (m[1] for m in re.findall(r, t))
or
process(m[1] for m in re.findall(r, t))
if you want to avoid creating the tuples, you can use finditer instead:
l = [m.group(2) for m in re.finditer(r, t)]
g = (m.group(2) for m in re.finditer(r, t))
finditer is also a good tool to use if you need to do more things with
each match:
for m in re.finditer(r, t):
s = m.group(2)
... process s in some way ...
the code body will be executed every time the RE engine finds a match,
which can be useful if you're working on large target strings, and only
want to process the first few matches.
for m in re.finditer(r, t):
s = m.group(2)
if s == something:
break
... process s in some way ...
</F>
More information about the Python-list
mailing list