Troubleshooting: re.finditer() creates object even when no match found

C

Chris Lasher

Hello,
I really like the finditer() method of the re module. I'm having
difficulty at the moment, however, because finditer() still creates a
callable-iterator oject, even when no match is found. This is
undesirable in cases where I would like to circumvent execution of code
meant to parse out data from my finditer() object.

I know that if I place a finditer() object in an iterative for loop,
the loop will not execute, but is there some way I can test to see if
the object contains no matches in the first place? I thought about
using .next() but I don't want to lose the ability to process the first
(sometimes only) match in the finditer() object.
Thanks in advance,
Chris
 
S

Steven Bethard

Chris said:
I know that if I place a finditer() object in an iterative for loop,
the loop will not execute, but is there some way I can test to see if
the object contains no matches in the first place?

Basically, you want to peek into an interable. See my recipes:

http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/304373

The short answer is that you can do something like:

try:
first, iterable = peek(iterable)
except StopIteration:
# do whatever you do if there are no matches
else:
# do whatever you do if there are matches

and you won't lose the first element of the iterable.

Steve
 
C

Chris Lasher

Thanks Steve,
That's odd that there's no built-in method to do this. It seems like
it would be a common task. Is there any way to request a feature like
this from the RE module keepers, whomever they may be?
In the meantime, may I use your code, with accredation to you?
Thanks,
Chris
 
S

Steven Bethard

Chris said:
Is there any way to request a feature like
this from the RE module keepers, whomever they may be?

The most direct way would be to go to Python at sourceforge[1] and make
a feature request to add peek to itertools. (This is probably the most
reasonable location for it.) Requests accompanied by patches are much
more likely to be accepted. =) Of course, your feature, if accepted,
wouldn't be applied until Python 2.5, which is probably about a year and
a half off.

I actually thought about doing this myself, but I've got a few other
things on my stack, and since itertools is (I believe) written in C,
writing the patch would be a little more work...
In the meantime, may I use your code, with accredation to you?

Help yourself. That's what the Cookbook's for. =)

[1] http://sourceforge.net/projects/python/
 
F

Fredrik Lundh

Chris said:
That's odd that there's no built-in method to do this. It seems like
it would be a common task.

if you do this a lot, maybe you shouldn't use finditer? iterators are
designed to give you the next item (if any) when you're ready to deal
with it... if that's not what you want, you can use findall, search loops,
scanner objects, etc. or you can implement a standard "iterate ahead"
loop.

what's your use case?

</F>
 
N

Nick Coghlan

Chris said:
Hello,
I really like the finditer() method of the re module. I'm having
difficulty at the moment, however, because finditer() still creates a
callable-iterator oject, even when no match is found. This is
undesirable in cases where I would like to circumvent execution of code
meant to parse out data from my finditer() object.

Take a look at itertools.tee

Cheers,
Nick.
 
N

Nick Coghlan

Nick said:
Take a look at itertools.tee

Bleh - I hit send instead of delete. Tee probably doesn't do what you want.
Steve's cookbook recipe is likely a better option.

Cheers,
Nick.
 
S

Steven Bethard

Nick said:
Bleh - I hit send instead of delete. Tee probably doesn't do what you
want. Steve's cookbook recipe is likely a better option.

Actually, there's an equally valid solution with tee too -- check Peter
Otten's comments at the bottom of the recipe.

Steve
 
M

Michael Hoffman

Steven said:
first, iterable = peek(iterable)

I really like this as a general solution to a problem that bothers me
occasionally. IMHO it's much better than having UndoFiles or similar
things lying about for every use case.

Thanks!
 

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

No members online now.

Forum statistics

Threads
473,769
Messages
2,569,579
Members
45,053
Latest member
BrodieSola

Latest Threads

Top