Mathematica - 从字符串搜索中排除字符串

时间:2011-07-06 22:00:55

标签: pattern-matching wolfram-mathematica string-matching

我正在尝试选择桌面上最常出现的关键词。 我需要搜索列表中不包含给定的第二,第三,第四等单词的单词出现次数。

例如,我需要搜索单词“lollypop”出现在不包含单词“candy”的列表中的次数。

此代码将返回单词“lollypop”出现的次数:

rt = Parallelize@
 Cases[MemoizeTable["Candy_table.txt"], 
  x_List /; 
   MemberQ[x, 
    s_String /; 
     StringMatchQ[s, ("*lollypop*"), IgnoreCase -> True]], {1}];

我尝试添加StringFreeQ以排除“糖果”,我尝试添加Nor,其中一个人会在字符串搜索中添加Or,但我不知道该怎么做/把它/它们放在哪里..?

基本上我需要一个"this" BUT NOT "that"代码。

2 个答案:

答案 0 :(得分:2)

要获得单词,请尝试例如

dl = DictionaryLookup[];

Select[dl, 
 StringFreeQ[#, ___ ~~ "ies" ~~ ___] && 
 StringMatchQ[#, ___ ~~ "loll" ~~ ___] &]
 (*
 -> {"loll", "lolled", "lolling", "lollipop", "lollipops", "lollop", "lolloped", "lolloping", "lollops", "lolls", "lolly"}
 *)

你可以通过在最后添加//Count来计算它们(比如说)。

编辑:我似乎误解了你的问题。如果您要问的是:计算“小食”出现在列表中的次数,哪个列表不包含“可修改”,则:

dl2 = {"titivation", "curving", "doppelgangers", "objurgations", 
"canapes", "invaluable", "modifiable", "dissect", "ominousness", 
"sentinel"}

If[Not@MemberQ[dl2, "modifiable"], Count[dl2, "canapes"], False]
(*
-> False
*)

,而

If[Not@MemberQ[dl2, "plate"], Count[dl2, "canapes"], False]

排除“盘子”,因此给这个列表1。

但我对你的评论感到困惑(“这段代码正在返回我正在运行其他搜索的列表的初步选择,所以我需要保持列表完好无损”哪个列表?它们都保持完好无损上面的代码)所以我仍然必须遗漏一些东西。

答案 1 :(得分:2)

excludeList = {"candy", "other"};
toCount = "lollypop";

numberOfToCount[list_, tocount_, excludeList_] := 
  If[And @@ ((! MemberQ[list, #]) & /@ excludeList), 
     Count[list, tocount], 
     "Excluded"];

用法:

numberOfToCount[{"lollypop", "lollypop", "the beatles"}, toCount, excludeList]
numberOfToCount[{"lollypop", "lollypop", "candy"}, toCount, excludeList]

(*
-> 2
-> Excluded
*)