 
 
 
 
 
 
RE: Pattern matching
- To: mathgroup at smc.vnet.net
- Subject: [mg33962] RE: [mg33912] Pattern matching
- From: "DrBob" <majort at cox-internet.com>
- Date: Wed, 24 Apr 2002 01:22:55 -0400 (EDT)
- Reply-to: <drbob at bigfoot.com>
- Sender: owner-wri-mathgroup at wolfram.com
Here's a simple solution that builds on the QMMatchQ you already found.
ClearAll[QMMatchQ]
QMMatchQ[s_String, p_String] :=
  MatchQ[Characters[s], Characters[p] /. "?"->_ ]
QMMatchQ[{s_String,p_String}]:=QMMatchQ[s,p]
QMMatchQ[s_String,p_List]:=Or@@(QMMatchQ[s,#]&/@p)
listData={"18K0F3C--" , "2K40GXX--" , "400HGXX--" ,"5M00G1F--" , 
      "960KG1D--"};
listTemplates={"???H?????" , "???K?????"};
Select[listData,QMMatchQ[#,listTemplates]&]
{"400HGXX--","960KG1D--"}
Bobby Treat
-----Original Message-----
From: John Leary [mailto:leary at paradise.net.nz] 
To: mathgroup at smc.vnet.net
Subject: [mg33962] [mg33912] Pattern matching
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,Len
gth[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

