Skip to main content

string manipulation - StringPattern: Not one of pattern?


I have read in a Mathematica notebook and have assigned its content to the variable file.


I have created the Strings corresponding to Wolfram Language symbols as follows:


wolframFunctions = #[[2]] & /@ WolframLanguageData[]; 

This list is nice, because I can now use it as an "or" StringPattern.


So if I wanted to find the amount each function is used in the file, I could do the following:


StringCases[
StringJoin[ (*join notebook sections together *)

Riffle[(ToString /@ (Flatten@NotebookImport@file)), "____"]],
wolframFunctions] // Tally

{{"Hold", 24}, {"C", 877}, {"All", 9}, {"Sin", 7}, {"N", 736}, {"Get",
9}, {"D", 916}, {"Tr", 154}, {"E", 711}, {"Sec", 4}, {"Simplify",
4}, {"I", 841}, {"O", 471}, {"Re", 44}, {"Beta", 3}, {"Pi",
9}, {"Solve", 1}, {"Method", 57}, {"Accuracy", 1}, {"Precision",
23}, {"Table", 1}, {"List", 1}, {"Plot", 90}, {"Range",
74}, {"Style", 108}, {"Thick", 52}, {"Point", 1}, {"Large",
1}, {"BaseStyle", 30}, {"Axes", 74}, {"Label", 52}, {"Failure",

2}, {"BoxData", 2}, {"RawBoxes", 1}, {"Row", 278}, {"TagBox",
176}, {"TemplateBox", 11}, {"Function", 110}, {"Sum", 198}, {"Head",
11}, {"Mod", 22}, {"False", 231}, {"Pane", 44}, {"Select",
33}, {"Grid", 198}, {"Button", 44}, {"Front", 22}, {"Square",
22}, {"Plus", 11}, {"Medium", 22}, {"Appearance", 22}, {"Automatic",
275}, {"Alignment", 66}, {"Graph", 30}, {"RGBColor", 44}, {"Abs",
66}, {"Line", 92}, {"AspectRatio", 22}, {"Frame", 88}, {"Tiny",
22}, {"Ticks", 44}, {"Gray", 22}, {"Level", 22}, {"BoundaryStyle",
22}, {"ScalingFunctions", 22}, {"Padding", 22}, {"Scale",
88}, {"Annotation", 77}, {"Left", 22}, {"AutoDelete",

44}, {"Spacings", 22}, {"Show", 44}, {"String", 22}, {"Print",
22}, {"Top", 22}, {"Baseline", 44}, {"Position", 33}, {"Min",
11}, {"Values", 11}, {"With", 11}, {"Times", 1}, {"Magnification",
44}, {"Hue", 2}}

where a snippet of the above notebook (file) is:


"HoldComplete[ClearAll[Global`*]]____HoldComplete[Rx[\[Theta]_] := \
{{1, 0, 0}, {0, Cos[\[Theta]], -Sin[\[Theta]]}, {0, Sin[\[Theta]], \
Cos[\[Theta]]}}; , Null, Ry[\[Theta]_] := {{Cos[\[Theta]], 0, Sin[\
\[Theta]]}, {0, 1, 0}, {-Sin[\[Theta]], 0, Cos[\[Theta]]}}; , Null, \

Rz[\[Theta]_] := {{Cos[\[Theta]], -Sin[\[Theta]], 0}, {Sin[\[Theta]], \
Cos[\[Theta]], 0}, {0, 0, 1}}; ]____HoldComplete[GetWx[Rmt_] := \
D[Rmt, t] . Transpose[Rmt]; , Null, GetW[Rmt_] := \
{{GetWx[Rmt][[3]][[2]]}, {GetWx[Rmt][[1]][[3]]}, \
{GetWx[Rmt][[2]][[1]]}}; ]____HoldComplete[(EsfPrimRot = \
Rz[\[Psi]sph[t]]; ) (EsfSecRot = Ry[\[Theta]sph[t]]; ) (EsfTerRot = \
Rx[\[Phi]sph[t]]; ) (PendSecRot = Ry[\[Alpha]pend[t]]; ) (PendPrimRot \
= Rx[\[Beta]pend[t]]; )]____HoldComplete[REsf = EsfPrimRot . \
EsfSecRot . EsfTerRot; , Null, RPend = REsf . PendPrimRot . \
PendSecRot; ]____HoldComplete[DVecPend = RPend . {{0}, {0}, \

{-radioPendulo}}; ]____HoldComplete[(\[CapitalOmega]Esf = \
Simplify[-GetW[Transpose[REsf]]]; ) (\[Omega]Esf = \
Simplify[GetW[REsf]]; ) (\[CapitalOmega]Pend = \
Simplify[-GetW[Transpose[RPend]]]; ) (\[Omega]Pend = \
Simplify[GetW[RPend]]; )]____HoldComplete[(InertiaPendulo = {{IxxP, \
0, 0}, {0, IyyP, 0}, {0, 0, IzzP}}; ) (InertiaSph = {{IxxS, 0, 0}, \
{0, IyyS, 0}, {0, 0, IzzS}}; )]____HoldComplete[(EROTESF = 0.5 \
(Transpose[\[CapitalOmega]Esf] . InertiaSph . \
\[CapitalOmega]Esf)[[1]][[1]]; ) (EROTPEND = 0.5 (Transpose[\
\[CapitalOmega]Pend] . InertiaPendulo . \

\[CapitalOmega]Pend)[[1]][[1]]; )]____HoldComplete[VecEsfera = \
{{x[t]}, {y[t]}, {radioEsfera}}; ]"

and it goes on for a long while with sections and plots, etc


But how could I StringReplace all not wolframFunctions with something like "NotASymbol"?




Comments

Popular posts from this blog

plotting - How to draw lines between specified dots on ListPlot?

I would like to create a plot where I have unconnected dots and some connected. So far, I have figured out how to draw the dots. My code is the following: ListPlot[{{1, 1}, {2, 2}, {3, 3}, {4, 4}, {1, 4}, {2, 5}, {3, 6}, {4, 7}, {1, 7}, {2, 8}, {3, 9}, {4, 10}, {1, 10}, {2, 11}, {3, 12}, {4,13}, {2.5, 7}}, Ticks -> {{1, 2, 3, 4}, None}, AxesStyle -> Thin, TicksStyle -> Directive[Black, Bold, 12], Mesh -> Full] I have thought using ListLinePlot command, but I don't know how to specify to the command to draw only selected lines between the dots. Do have any suggestions/hints on how to do that? Thank you. Answer One possibility would be to use Epilog with Line : ListPlot[ {{1, 1}, {2, 2}, {3, 3}, {4, 4}, {1, 4}, {2, 5}, {3, 6}, {4, 7}, {1, 7}, {2, 8}, {3, 9}, {4, 10}, {1, 10}, {2, 11}, {3, 12}, {4, 13}, {2.5, 7}}, Ticks -> {{1, 2, 3, 4}, None}, AxesStyle -> Thin, TicksStyle -> Directive[Black, Bold, 12], Mesh -> Full, Epilog -> { Line[ ...

dynamic - How can I make a clickable ArrayPlot that returns input?

I would like to create a dynamic ArrayPlot so that the rectangles, when clicked, provide the input. Can I use ArrayPlot for this? Or is there something else I should have to use? Answer ArrayPlot is much more than just a simple array like Grid : it represents a ranged 2D dataset, and its visualization can be finetuned by options like DataReversed and DataRange . These features make it quite complicated to reproduce the same layout and order with Grid . Here I offer AnnotatedArrayPlot which comes in handy when your dataset is more than just a flat 2D array. The dynamic interface allows highlighting individual cells and possibly interacting with them. AnnotatedArrayPlot works the same way as ArrayPlot and accepts the same options plus Enabled , HighlightCoordinates , HighlightStyle and HighlightElementFunction . data = {{Missing["HasSomeMoreData"], GrayLevel[ 1], {RGBColor[0, 1, 1], RGBColor[0, 0, 1], GrayLevel[1]}, RGBColor[0, 1, 0]}, {GrayLevel[0], GrayLevel...

list manipulation - Selecting multiple columns from a matrix?

Sample data: data = { {{2013, 1, 1}, 24.13, 167.67, 231.82}, {{2013, 1, 2}, 32.15, 170.92, 225.99}, {{2013, 1, 3}, 35.43, 172.68, 221.67}, {{2013, 1, 4}, 36.73, 173.05, 218.32}, {{2013, 1, 5}, 58.19, 165.96, 197.05}, {{2013, 1, 6}, 69.99, 163.50, 187.52}, {{2013, 1, 7}, 71.37, 154.21, 175.58}, {{2013, 1, 8}, 72.51, 149.66, 163.25}}; I want a DateListPlot with three graphs, so for a matrix formed by columns 1 and 2, one for columns 1 and 3, and 1 for columns 1 and 4. At the moment I'm using this code: data2 = Transpose[{data[[All, 1]], data[[All, 2]]}]; data3 = Transpose[{data[[All, 1]], data[[All, 3]]}]; data4 = Transpose[{data[[All, 1]], data[[All, 4]]}]; DateListPlot[{data2, data3, data4}, Joined -> True, Filling -> {3 -> {1}}] but I have a hunch that this can be done more efficiently. I don't like the Transpose s in particular. Any ideas? edit (for extra credit) What if I need to multiply the second column by 2, which in my solution is simp...