Re: Pattern matching
- To: mathgroup at smc.vnet.net
- Subject: [mg33960] Re: Pattern matching
- From: "Allan Hayes" <hay at haystack.demon.co.uk>
- Date: Wed, 24 Apr 2002 01:22:38 -0400 (EDT)
- References: <aa3fq4$7tv$1@smc.vnet.net>
- Sender: owner-wri-mathgroup at wolfram.com
John, listData={"18K0F3C--" , "2K40GXX--" , "400HGXX--" , "5M00G1F--" , "960KG1D--"}; char=Characters/@listData cas2= Cases[char, {_,_,_,"H"|"K",__}] {{4,0,0,H,G,X,X,-,-},{9,6,0,K,G,1,D,-,-}} StringJoin@@@cas {400HGXX--,960KG1D--} -- Allan --------------------- Allan Hayes Mathematica Training and Consulting Leicester UK www.haystack.demon.co.uk hay at haystack.demon.co.uk Voice: +44 (0)116 271 4198 Fax: +44 (0)870 164 0565 "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 > > >