Re: pattern matching
- To: mathgroup at smc.vnet.net
- Subject: [mg7026] Re: [mg6967] pattern matching
- From: Rick Muirhead <muirhead at dirac.phys.washington.edu>
- Date: Fri, 2 May 1997 21:30:52 -0400 (EDT)
- Sender: owner-wri-mathgroup at wolfram.com
On Wed, 30 Apr 1997, Marc Mazzariol wrote:
> Hello,
>
> I'm using mathematica 2.2 (Unix), and i'm trying to do pattern
> matching with repeated patterns.
>
> This example produce the result i want :
>
> In : {a,a,a,b} /. {a...,b} -> Hello
> Out : Hello
>
> But this one don't :
>
> In : {b} /. {a...,b} -> Hello
> Out : {b}
>
> I was hopping : Out : Hello
>
> Why doesn't work it ???
>
> --
> +--------------------------------------------------------+
> | - No brain, no headache - |
> +--------------------------------------------------------+
> | Marc Mazzariol |
> | Swiss Federal Institute of Technology (EPFL) |
> | Peripheral Systems Laboratory (LSP) |
> | CH-1015 Lausanne, Switzerland |
> | Tel: +41 21 693 3944 |
> | Fax: +41 21 693 6680 |
> | E-mail: Marc.Mazzariol at di.epfl.ch |
> +--------------------------------------------------------+
>
Greetings Marc,
In general, I get some insight, however tiny, on how the patterns do or
do not match by playing with MatchQ. In your case, we find
In[1]:=
MatchQ[ {b}, {a...,b}]
Out[1]:=
False
whereas:
In[2]:=
MatchQ[{a,a,a,a,a,a,b},{a...,b}]
Out[2]:=
True
Similarly, your pattern won't recognize {b,a,a,a,a,a}
Something that does work, though I suspect there are more elegant
solutions, would be
In[3]:=
{a,a,a,a,a,a,b} /.{a...,b} | {b}->Hello
Out[3]:=
Hello
In[4]:=
{b}/.{a...,b} | {b}->Hello
Out[4]:=
Hello
The | sign is Mma's pattern alternative sign ... I think of it as an OR
within patterns.
Off the subject .... if your purpose is to determine if the symbol b is
a member of your list, you might instead try the MemberQ function, which
I find a good deal more transparent then the pattern matching:
In[5]:=
MemberQ[{a,a,a,a,a,b},b]
Out[5]:=
True
In[6]:=
MemberQ[{a,a,a,a,a},b]
Out[6]:=
False
Rick Muirhead
Physics UW