Regexp : repeated group identification
Vlastimil Brom
vlastimil.brom at gmail.com
Wed Dec 14 06:34:16 EST 2011
2011/12/14 candide <candide at free.invalid>:
> Consider the following code
>
> # ----------------------------
> import re
>
> z=re.match('(Spam\d)+', 'Spam4Spam2Spam7Spam8')
> print z.group(0)
> print z.group(1)
> # ----------------------------
>
> outputting :
>
> ----------------------------
> Spam4Spam2Spam7Spam8
> Spam8
> ----------------------------
>
> The '(Spam\d)+' regexp is tested against 'Spam4Spam2Spam7Spam8' and the
> regexp matches the string.
>
> Group numbered one within the regex '(Spam\d)+' refers to Spam\d
>
> The fours substrings
>
> Spam4 Spam2 Spam7 and Spam8
>
> match the group numbered 1.
>
> So I don't understand why z.group(1) gives the last substring (ie Spam8 as
> the output shows), why not an another one, Spam4 for example ?
> --
> http://mail.python.org/mailman/listinfo/python-list
Hi,
you may find a tiny notice in the re docs on this:
http://docs.python.org/library/re.html#re.MatchObject.group
"If a group is contained in a part of the pattern that matched
multiple times, the last match is returned."
If you need to work with the content captured in the repeated group,
you may check the new regex implementation:
http://pypi.python.org/pypi/regex
Which has a special "captures" method of the match object for this
(beyond many other improvements):
>>> import regex
>>> m=regex.match('(Spam\d)+', 'Spam4Spam2Spam7Spam8')
>>> m.captures(1)
['Spam4', 'Spam2', 'Spam7', 'Spam8']
>>>
hth,
vbr
More information about the Python-list
mailing list