a list/re problem
Ed Keith
e_d_k at yahoo.com
Fri Dec 11 17:31:46 EST 2009
--- On Fri, 12/11/09, Peter Otten <__peter__ at web.de> wrote:
> From: Peter Otten <__peter__ at web.de>
> Subject: Re: a list/re problem
> To: python-list at python.org
> Date: Friday, December 11, 2009, 4:24 PM
> Ed Keith wrote:
>
> > I have a problem and I am trying to find a solution to
> it that is both
> > efficient and elegant.
> >
> > I have a list call it 'l':
> >
> > l = ['asc', '*nbh*', 'jlsdjfdk', 'ikjh',
> '*jkjsdfjasd*', 'rewr']
> >
> > Notice that some of the items in the list start and
> end with an '*'. I
> > wish to construct a new list, call it 'n' which is all
> the members of l
> > that start and end with '*', with the '*'s removed.
> >
> > So in the case above n would be ['nbh', 'jkjsdfjasd']
> >
> > the following works:
> >
> > r = re.compile('\*(.+)\*')
> >
> > def f(s):
> > m = r.match(s)
> > if m:
> > return
> m.group(1)
> > else:
> > return ''
> >
> > n = [f(x) for x in l if r.match(x)]
> >
> >
> >
> > But it is inefficient, because it is matching the
> regex twice for each
> > item, and it is a bit ugly.
> >
> > I could use:
> >
> >
> > n = []
> > for x in keys:
> > m = r.match(x)
> > if m:
> >
> n.append(m.group(1))
> >
> >
> > It is more efficient, but much uglier.
>
> It's efficient and easy to understand; maybe you have to
> readjust your
> taste.
>
> > Does anyone have a better solution?
>
> In this case an approach based on string slicing is
> probably best. When the
> regular expression gets more complex you can use a nested a
> generator
> expression:
>
> >>> items = ['asc', '*nbh*', 'jlsdjfdk', 'ikjh',
> '*jkjsdfjasd*', 'rewr']
> >>> match = re.compile(r"\*(.+)\*").match
> >>> [m.group(1) for m in (match(s) for s in items)
> if m is not None]
> ['nbh', 'jkjsdfjasd']
>
I am going to use string slicing, re is the wrong tool for the job. But this is what I was looking for when I posted. Simple, elegant and efficient.
Thanks all,
-EdK
Ed Keith
e_d_k at yahoo.com
Blog: edkeith.blogspot.com
More information about the Python-list
mailing list