I want to pattern match all symbols beginning with $e$
{e1 x e2 y e3 z e4} /. lettersBeginningWithe -> 3 How can this be done in mathematica?
You may use SymbolName with StringStartsQ.
{e1 x e2 y e3 z e4} /. s_Symbol /; StringStartsQ["e"]@SymbolName[s] -> 3 (* {81 x y z} *) Hope this helps.
Improvement Courtesy of Karsten. 7 (see comments)
Just a way using Pick:
var = {e1 , x , e2, y, e3, z, e4}; Pick[var, StringTake[#, 1] & /@ (ToString /@ var), "e"] Improved:
Pick[var, StringTake[ToString /@ var, 1], "e"] Using Cases
Cases[var, _?(StringTake[ToString[#], 1] == "e" &)] Using StringMatchQ (method is corrected by Alexey Popkov, see comments):
Pick[var, StringMatchQ[ToString[#], "e" ~~ ___] & /@ var] Improved:
Pick[var, StringMatchQ[ToString /@ var, "e" ~~ ___]] /@ inside Pick. Unleash the full power and beauty of Pick by taking advantage of the Listable attribute: Pick[var, StringTake[ToString /@ var, 1], "e"] and Pick[var, StringContainsQ[ToString /@ var, "e" ~~ _]]. $\endgroup$ StringContainsQ["aer", "e" ~~ _] returns True what isn't what you want. The correct test is StringMatchQ["aer", "e" ~~ ___]. $\endgroup$ StringContainsQ with correct method which uses StringMatchQ. $\endgroup$ MatchQ[e3, a_ /; First[Characters[ToString[a]]] === "e"]
e1 = 2;andHold[{e1 x e2 y e3 z e4}]is the expression you want to search? $\endgroup$Unique[]. $\endgroup$