[Mpls-pm] Interesting RegEx Problem
Glenn Bushee
glenn at easy-access.com
Mon Sep 19 12:46:02 PDT 2005
If I understand the problem correctly, it reminds me of something
Friedl mentioned in a talk that he was doing about his work at Yahoo
-- making a regex engine so that company names (and various versions
of them) could be efficiently substituted in news articles with the
stock symbol and lookup link. Unfortunately, I couldn't find a module
on CPAN that facilitates this or includes his code, but this might
give a different direction to go on this -- perhaps even contacting
Friedl directly.
And if you were going to take the collection and perform a search like
what was mentioned before, essentially iterating through the
collection and then through the regexes for each, perhaps you could do
an up-front sorting of the collection and the regexes.
For example, if the collection is of various lengths:
# try to match the easier ones (roughly speaking) first
@collection = sort { length($a) <=> length($b) } @collection;
# sort out the regexes by complexity (this could get ugly) or
# at least get the faster matches up front
# Perhaps a hash could be used instead to build a smarter version of this.
# Example below is to pull out the regexes that do a begining match first
# eg: @regexes = ('/abc/', '/^abc/', '/abc$/', '/^abc$/');
@regexes = sort { $b =~ m#^/\^# <=> $a =~ m#^/\^# } @regexes;
Then use these to do the iterative approach. And if the regex is to
only be used once in the assumed 1-to-1 relationship, you can splice
it out of @regexes as you go onto the next string.
I hope this wasn't too confusing or off the track you were going.
- Glenn
On 9/19/05, Ian Malpass <ian at indecorous.com> wrote:
> On Mon, 19 Sep 2005, Robert Fischer wrote:
>
> > I need to rephrase the problem, though, because I realize I left a major
> > aspect out of the phrasing: Given a *collection of* strings and a
> > collection of regular expression strings, where it is known that each
> > string is matched by precisely one regular expression, how do you most
> > efficiently develop the mapping?
> >
> > Given that arrangement, I'm currently looking at lexically sorting the
> > strings and getting an MRU list for the pattern matches. That
> > implementation assumes that strings which are lexically close are liable
> > to match the same (or similar) regular expressions.
>
> Are they, though? "Alphabet" and "ZZ 9 Plural Z Alpha" both match /Alpha/.
> And /^.*Alpha.*$/ for that matter, if you need to match the entire string.
> A bit of a pathalogical case, I know, but it illustrates the point.
>
> I'm not saying your approach won't bring some improvement, but the extra
> list maintenance and sorting will add overhead too. I'd profile it against
> a more straightforward approach (e.g. nested loops) and see what benefits
> it brings. Probably depends on the set sizes. Certainly depends on the set
> contents.
>
> More complexity brings more opportunity for things to go wrong, and more
> difficulty maintaining things later :(
>
> Ian
>
> -
> ---------------------------------------------------------------------------
>
> The soul would have no rainbows if the eyes held no tears.
>
> Ian Malpass
> <ian at indecorous.com>
> _______________________________________________
> Mpls-pm mailing list
> Mpls-pm at pm.org
> http://mail.pm.org/mailman/listinfo/mpls-pm
>
More information about the Mpls-pm
mailing list