【问题标题】:Mathematica - StringMatch Elements Within a List?Mathematica - 列表中的 StringMatch 元素?
【发布时间】:2011-06-30 18:33:08
【问题描述】:

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

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]

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

【问题讨论】:

    标签: list wolfram-mathematica string-matching


    【解决方案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}

    【讨论】:

    • {{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”}、“已删除。”}、{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"}}
    • 这将是第一个函数返回的一个小样本列表。我只需要每个最后一个结果,因此样本应该返回两个结果(例如,“1,1”)。
    • 谢谢!有没有办法跨多个元素执行 StringMatchQ?喜欢 {8,9}?
    • @Rosie 你的意思是这样你就可以得到例如1 如果任何元素匹配,0 如果没有匹配?
    • 是的,我想返回相同的东西,我只想检查每个列表中的多个位置,因为某些列表具有不同数量的元素。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多