Bug in re.findall?

M

Marcin Krol

Hello everyone,

Is there a bug in re.findall in Python 2.4? See:

subnetlist="192.168.100.0 , 192.168.101.0"
ipre=re.compile("([0-9]{1,3}\.){3}[0-9]{1,3}")

['100.', '101.']


But:

a=ipre.finditer(subnetlist)
Traceback (most recent call last):
File "<stdin>", line 1, in ?
StopIteration

Also:
'192.168.100.0'

Is this a bug or am I doing smth wrong?
 
D

dwahli

Hello everyone,

Is there a bug in re.findall in Python 2.4? See:

subnetlist="192.168.100.0 , 192.168.101.0"
ipre=re.compile("([0-9]{1,3}\.){3}[0-9]{1,3}")

 >>> ipre.findall(subnetlist)

['100.', '101.']

But:

a=ipre.finditer(subnetlist)

 >>> a.next().group()
'192.168.100.0'
 >>> a.next().group()
'192.168.101.0'
 >>> a.next().group()
Traceback (most recent call last):
   File "<stdin>", line 1, in ?
StopIteration

Also:

 >>> ipre.search(subnetlist).group()
'192.168.100.0'

Is this a bug or am I doing smth wrong?

Look strange but match the Python documentation for re.findall:
"If one or more groups are present in the pattern, return a list of
groups; this will be a list of tuples if the pattern has more than one
group"

you must use this RE for your example to match what you expect:
ipre=re.compile("(?:[0-9]{1,3}\.){3}[0-9]{1,3}")

but using re.finditer is IMHO better.

Cheer,
Dom
 
P

Peter Otten

Marcin said:
Hello everyone,

Is there a bug in re.findall in Python 2.4? See:

subnetlist="192.168.100.0 , 192.168.101.0"
ipre=re.compile("([0-9]{1,3}\.){3}[0-9]{1,3}")

['100.', '101.']


But:

a=ipre.finditer(subnetlist)
Traceback (most recent call last):
File "<stdin>", line 1, in ?
StopIteration

Also:
'192.168.100.0'

Is this a bug or am I doing smth wrong?

From the doc:

"""
findall( pattern, string[, flags])
Return a list of all non-overlapping matches of pattern in string. If one
or more groups are present in the pattern, return a list of groups; this
will be a list of tuples if the pattern has more than one group.
"""

So findall()'s behaviour changes depending on the number of explicit groups

None:

[m.group() for m in re.finditer(...)]

One:

[m.group(1) for m in re.finditer(...)]

More than one:

[m.groups() for m in re.finditer(...)]

all in accordance with the documentation.

Peter
 

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,780
Messages
2,569,611
Members
45,265
Latest member
TodLarocca

Latest Threads

Top