[Tutor] Regular Expression question
Danny Yoo
dyoo@hkn.eecs.berkeley.edu
Fri Apr 18 16:41:00 2003
On Fri, 18 Apr 2003, Scott Chapman wrote:
> On Friday 18 April 2003 11:46, Jay Dorsey wrote:
> > Scott Chapman wrote:
> > > Is it possible to make a regular expression that will match:
> > > '<html blah>' or '<html>'
> > > without having to make it into two complete expressions seperated by a
> > > pipe: r'<html[ \t].+?>|<html>'
> > >
> > > I want it to require a space or tab and at least one character before the
> > > closing bracket, after 'html', or just the closing bracket.
> > >
> > > Scott
> >
> > How about
> >
> > '<html([ \t][^>]+)?>'
> >
>
> Thanks for the reply. After seeing these replies, it seems clear that
> you can use the grouping ()'s for more than just capturing a section for
> output.
Hi Scott,
Yes, the grouping parentheses are serving two functions: they are defining
a group for both capturing values and for aggregation.
There's another set of regular-expression parentheses that don't capture,
although they do still aggregate:
###
>>> regex = re.compile('(?:a+)(b+)(a+)')
>>> matchobj = regex.match('aaaaaabbbbaa')
>>> matchobj.group(1)
'bbbb'
>>> matchobj.group(2)
'aa'
###
Notice that the first set of parentheses, the ones that match again the
first set of "aaaa"'s, don't form a captured group.
[Wow, "captured group" sound like a term from Go or something... *grin*]
The non-grouping parentheses use the special form:
(?:
The docs on them are a little sparse, but you can read more about them
here:
http://www.python.org/doc/lib/re-syntax.html
Look for the words "non-grouping" and you should see them. There's
actually a few Python-specific extensions to the regular-expression
grouping that are pretty cool: it's even possible to create "named"
groups so that we don't have to do things like column counting to keep
track of groups.
> I think I missed that in the docs I've been reading. I wonder where all
> this works? For instance, will it work on either side of a '|'? I'll
> have to play with this further!
It sounds like you're getting interested in regular expressions. You may
find AMK's "Regular Expression HOWTO" a slightly gentler introduction to
regular expressions:
http://www.amk.ca/python/howto/regex/
Best of wishes to you!