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

front end - keyboard shortcut to invoke Insert new matrix

I frequently need to type in some matrices, and the menu command Insert > Table/Matrix > New... allows matrices with lines drawn between columns and rows, which is very helpful. I would like to make a keyboard shortcut for it, but cannot find the relevant frontend token command (4209405) for it. Since the FullForm[] and InputForm[] of matrices with lines drawn between rows and columns is the same as those without lines, it's hard to do this via 3rd party system-wide text expanders (e.g. autohotkey or atext on mac). How does one assign a keyboard shortcut for the menu item Insert > Table/Matrix > New... , preferably using only mathematica? Thanks! Answer In the MenuSetup.tr (for linux located in the $InstallationDirectory/SystemFiles/FrontEnd/TextResources/X/ directory), I changed the line MenuItem["&New...", "CreateGridBoxDialog"] to read MenuItem["&New...", "CreateGridBoxDialog", MenuKey["m", Modifiers-...

How to thread a list

I have data in format data = {{a1, a2}, {b1, b2}, {c1, c2}, {d1, d2}} Tableform: I want to thread it to : tdata = {{{a1, b1}, {a2, b2}}, {{a1, c1}, {a2, c2}}, {{a1, d1}, {a2, d2}}} Tableform: And I would like to do better then pseudofunction[n_] := Transpose[{data2[[1]], data2[[n]]}]; SetAttributes[pseudofunction, Listable]; Range[2, 4] // pseudofunction Here is my benchmark data, where data3 is normal sample of real data. data3 = Drop[ExcelWorkBook[[Column1 ;; Column4]], None, 1]; data2 = {a #, b #, c #, d #} & /@ Range[1, 10^5]; data = RandomReal[{0, 1}, {10^6, 4}]; Here is my benchmark code kptnw[list_] := Transpose[{Table[First@#, {Length@# - 1}], Rest@#}, {3, 1, 2}] &@list kptnw2[list_] := Transpose[{ConstantArray[First@#, Length@# - 1], Rest@#}, {3, 1, 2}] &@list OleksandrR[list_] := Flatten[Outer[List, List@First[list], Rest[list], 1], {{2}, {1, 4}}] paradox2[list_] := Partition[Riffle[list[[1]], #], 2] & /@ Drop[list, 1] RM[list_] := FoldList[Transpose[{First@li...

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[ ...