Re: Pattern matching
- To: mathgroup at smc.vnet.net
- Subject: [mg33961] Re: Pattern matching
- From: bghiggins at ucdavis.edu (Brian Higgins)
- Date: Wed, 24 Apr 2002 01:22:51 -0400 (EDT)
- References: <aa3fq4$7tv$1@smc.vnet.net>
- Sender: owner-wri-mathgroup at wolfram.com
John, Perhaps this will be more efficient:
myfunc[data_, template_] :=
Flatten[Map[Function[w, Select[data, MatchQ[Characters[#], w] &]],
Characters[template] /. "?" -> _]]
In[30]:=myfunc[listData,listTemplates]
Out[30]={400HGXX--,960KG1D--}
Cheers,
Brian
John Leary <leary at paradise.net.nz> wrote in message news:<aa3fq4$7tv$1 at smc.vnet.net>...
> Greetings
>
> Can you help me please - there must be a simple solution to this problem,
> but I can't find it.
>
> From a list of character strings and a list of templates, I need to
> produce a list of all strings that match any of the templates. For example:
>
> listData={"18K0F3C--" , "2K40GXX--" , "400HGXX--" , "5M00G1F--" , "960KG1D--"}
> listTemplates={"???H?????" , "???K?????"}
> result={"400HGXX--","960KG1D--"}
>
> In the templates, ? is a wild-card that represents a single character.
> The data strings contain only alpha-numeric characters and hyphens - no
> other characters.
> There are no special requirements for the result: duplication and random
> order are acceptable.
>
>
> I searched the MathGroup archive and found a very useful function that does
> exactly what I want, but it works only on individual strings, not lists of
> strings (msg00051):
>
> QMMatchQ[s_String, p_String] := MatchQ[Characters[s], Characters[p] /. "?"
> -> _ ]
>
>
>
> I tried to use it in the following way, but the result is a list of the
> matching templates, not the matching strings :
>
> QMMatchQ[s_String, p_String] := MatchQ[Characters[s], Characters[p] /. "?"
> -> _ ]
> SetOptions[Intersection, SameTest -> (QMMatchQ[#1,#2]& )];
> result=Intersection[listData,listTemplates]
> {"???H?????","???K?????"}
>
>
> It ought to be a small step from there to the result that I need, but I
> can't find a simple solution.
>
> One alternative approach would be a Do loop:
>
> b={};
> Do[b=Append[b,Select[listData,QMMatchQ[#,listTemplates[[n]]]&]],{n,1,Length[listTemplates]}]
>
> This works but seems to be very slow for large lists. In the real case,
> listData can be very large - up to 250,000 elements - and the Do loop
> approach doesn't seem to be optimum.
>
>
> I would be very grateful for your help.
>
>
> Regards
>
> John Leary