Mathematica - 列表中的StringMatch元素?

时间:2011-06-30 18:33:08

标签: list wolfram-mathematica string-matching

我有一个函数可以从一个匹配特定字符串的表中返回case。 一旦我得到了匹配这些字符串的所有案例,我需要搜索特定字符串的每个案例(这是它自己的列表)并执行哪个命令。但我所知道的是将整个列表大小转换成一个字符串,然后我只得到一个结果(当我需要每个案例的结果时)。

UC@EncodeTable;

 EncodeTable[id_?PersonnelQ, f___] :=
  Cases[#, 
   x_List /; 
   MemberQ[x, 
   s_String /; 
   StringMatchQ[
    s, ("*ah*" | "*bh*" | "*gh*" | "*kf*" | 
      "*mn*"), IgnoreCase -> True]], {1}] &@
   Cases[MemoizeTable["PersonnelTable.txt"], {_, id, __}]

该函数正在从表中返回案例

Which[(StringMatchQ[
 ToString@
  EncodeTable[11282], ("*bh*" | "*ah*" | 
   "*gh*" ), IgnoreCase -> True]) == True, 1, 
 (StringMatchQ[
 ToString@
   EncodeTable[11282], ("*bh*" | "*ah*" | 
   "*gh*" ), IgnoreCase -> True]) == False, 0]

该函数是SUPPOSED为第一个函数返回的每个案例返回1或0,但我不知道如何在列表中搜索而不将它们全部一个字符串并为每个列表返回结果。

1 个答案:

答案 0 :(得分:1)

好吧,你们想要Map,但是如果不知道要操作的数据结构是什么,就很难说。也许你可以提供一个例子。

编辑:在评论中,示例结果为

dat = {{204424, 11111, SQLDateTime[{1989, 4, 4, 0, 0, 0.}], Null, 
"Parthom, Mary, MP", Null, 4147, 
"T-00010 AH BH UI", {"T-00010 AH BH UI", "M-14007 LL GG", 
 "F-Y3710 AH LL UI GG"}, "REMOVED."}, {2040, 11111, 
SQLDateTime[{1989, 4, 13, 0, 1, 0.}], Null, "KEVIN, Stevens, STK",
 Null, 81238, 
"T-00010 ah gh mn", {"T-00010 mn", "M-00100 dd", "P-02320 sd", 
 "M-14003 ed", "T-Y8800 kf", "kj"}}};

(实际上这个例子有一个语法错误,所以我把它修好了,我希望是正确的方法)。

现在,如果我定义一个函数

func = Which[(StringMatchQ[#[[8]], ("*bh*" | "*ah*" | "*gh*"), 
   IgnoreCase -> True]) == True, 1, True, 0] &;

(请注意,要匹配的第二个条件可能写为True,请参阅Which的文档)

func[dat[[1]]]
(*
-> 1
*)

(请注意,我已经略微改变了func你所拥有的,为了让它做我认为你想要实际做的事情)。然后可以将其应用于dat,其元素具有您提供的格式,如下所示:

Map[func, dat]

(*     - > {1,1}    *) 我不确定这是不是你想要的,我做了最好的猜测。

EDIT2:在回复关于要匹配的元素的位置变量的评论时,这是一种方式:

ClearAll[funcel]
funcel[p_String] := 
  Which[StringMatchQ[p, ("*bh*" | "*ah*" | "*gh*"), 
   IgnoreCase -> True], 1, True, 0];
funcel[___] := 0;

ClearAll[func];
func[lst_List] := Which[MemberQ[Map[funcel, lst], 1], 1, True, 0]

这样

Map[func, dat]

给出{1,1}