2015-09-21 50 views
0

我想在一堆python模塊中找到像電子郵件,路徑或服務器名稱(在這個例子中只是電子郵件)的硬編碼字符串。 我試圖檢查所有字典,列表和屬性,如果它們包含「郵件」裏面,然後檢查它們是否包含字符串。儘管我得到了所有硬編碼郵件,但我也收到了mailList,它們不是硬編碼的,但是在行中有qoutes。在xpath中搜索python的硬編碼

//TESTLIST_STAR_EXPR[contains(@tokenValue,"mail")]/..//STRING[contains(@tokenValue,"'")] 

這裏是一個XML樣本,這是從一個Python模塊解析:

<FILE_INPUT tokenValue="import" tokenLine="7" tokenColumn="0"> 
    <STATEMENT tokenValue="import" tokenLine="7" tokenColumn="0"> 
    <STMT_LIST tokenValue="import" tokenLine="7" tokenColumn="0"> 
     <SIMPLE_STMT tokenValue="import" tokenLine="7" tokenColumn="0"> 
     <IMPORT_STMT tokenValue="import" tokenLine="7" tokenColumn="0"> 
      <IMPORT_NAME tokenValue="import" tokenLine="7" tokenColumn="0"> 
      <IMPORT tokenValue="import" tokenLine="7" tokenColumn="0"/> 
      <DOTTED_AS_NAMES tokenValue="mails" tokenLine="7" tokenColumn="7"> 
       <DOTTED_AS_NAME tokenValue="mails" tokenLine="7" tokenColumn="7"> 
       <DOTTED_NAME tokenValue="mails" tokenLine="7" tokenColumn="7"> 
        <NAME tokenValue="mails" tokenLine="7" tokenColumn="7"> 
        <IDENTIFIER tokenValue="mails" tokenLine="7" tokenColumn="7"/> 
        </NAME> 
       </DOTTED_NAME> 
       </DOTTED_AS_NAME> 
      </DOTTED_AS_NAMES> 
      </IMPORT_NAME> 
     </IMPORT_STMT> 
     </SIMPLE_STMT> 
    </STMT_LIST> 
    <NEWLINE tokenValue=" 
" tokenLine="7" tokenColumn="12"/> 
    </STATEMENT> 
    <STATEMENT tokenValue="serverList" tokenLine="10" tokenColumn="0"> 
    <STMT_LIST tokenValue="serverList" tokenLine="10" tokenColumn="0"> 
     <SIMPLE_STMT tokenValue="serverList" tokenLine="10" tokenColumn="0"> 
     <EXPRESSION_STMT tokenValue="serverList" tokenLine="10" tokenColumn="0"> 
      <TESTLIST_STAR_EXPR tokenValue="serverList" tokenLine="10" tokenColumn="0"> 
      <TEST tokenValue="serverList" tokenLine="10" tokenColumn="0"> 
       <ATOM tokenValue="serverList" tokenLine="10" tokenColumn="0"> 
       <NAME tokenValue="serverList" tokenLine="10" tokenColumn="0"> 
        <IDENTIFIER tokenValue="serverList" tokenLine="10" tokenColumn="0"/> 
       </NAME> 
       </ATOM> 
      </TEST> 
      </TESTLIST_STAR_EXPR> 
      <ASSIGN tokenValue="=" tokenLine="10" tokenColumn="11"/> 
      <TESTLIST_STAR_EXPR tokenValue="[" tokenLine="10" tokenColumn="13"> 
      <TEST tokenValue="[" tokenLine="10" tokenColumn="13"> 
       <ATOM tokenValue="[" tokenLine="10" tokenColumn="13"> 
       <LBRACKET tokenValue="[" tokenLine="10" tokenColumn="13"/> 
       <TESTLIST_COMP tokenValue="'chserver.prod.amce'" tokenLine="10" tokenColumn="14"> 
        <TEST tokenValue="'chserver.prod.amce'" tokenLine="10" tokenColumn="14"> 
        <ATOM tokenValue="'chserver.prod.amce'" tokenLine="10" tokenColumn="14"> 
         <STRING tokenValue="'chserver.prod.amce'" tokenLine="10" tokenColumn="14"/> 
        </ATOM> 
        </TEST> 
       </TESTLIST_COMP> 
       <RBRACKET tokenValue="]" tokenLine="10" tokenColumn="34"/> 
       </ATOM> 
      </TEST> 
      </TESTLIST_STAR_EXPR> 
     </EXPRESSION_STMT> 
     </SIMPLE_STMT> 
    </STMT_LIST> 
    <NEWLINE tokenValue=" 
" tokenLine="10" tokenColumn="35"/> 
    </STATEMENT> 
    <STATEMENT tokenValue="mailDic" tokenLine="12" tokenColumn="0"> 
    <STMT_LIST tokenValue="mailDic" tokenLine="12" tokenColumn="0"> 
     <SIMPLE_STMT tokenValue="mailDic" tokenLine="12" tokenColumn="0"> 
     <EXPRESSION_STMT tokenValue="mailDic" tokenLine="12" tokenColumn="0"> 
      <TESTLIST_STAR_EXPR tokenValue="mailDic" tokenLine="12" tokenColumn="0"> 
      <TEST tokenValue="mailDic" tokenLine="12" tokenColumn="0"> 
       <ATOM tokenValue="mailDic" tokenLine="12" tokenColumn="0"> 
       <NAME tokenValue="mailDic" tokenLine="12" tokenColumn="0"> 
        <IDENTIFIER tokenValue="mailDic" tokenLine="12" tokenColumn="0"/> 
       </NAME> 
       </ATOM> 
      </TEST> 
      </TESTLIST_STAR_EXPR> 
      <ASSIGN tokenValue="=" tokenLine="12" tokenColumn="8"/> 
      <TESTLIST_STAR_EXPR tokenValue="{" tokenLine="12" tokenColumn="10"> 
      <TEST tokenValue="{" tokenLine="12" tokenColumn="10"> 
       <ATOM tokenValue="{" tokenLine="12" tokenColumn="10"> 
       <LCURLYBRACE tokenValue="{" tokenLine="12" tokenColumn="10"/> 
       <DICTORSETMAKER tokenValue="'John'" tokenLine="12" tokenColumn="12"> 
        <TEST tokenValue="'John'" tokenLine="12" tokenColumn="12"> 
        <ATOM tokenValue="'John'" tokenLine="12" tokenColumn="12"> 
         <STRING tokenValue="'John'" tokenLine="12" tokenColumn="12"/> 
        </ATOM> 
        </TEST> 
        <COLON tokenValue=":" tokenLine="12" tokenColumn="19"/> 
        <TEST tokenValue="'[email protected]'" tokenLine="12" tokenColumn="21"> 
        <ATOM tokenValue="'[email protected]'" tokenLine="12" tokenColumn="21"> 
         <STRING tokenValue="'[email protected]'" tokenLine="12" tokenColumn="21"/> 
        </ATOM> 
        </TEST> 
       </DICTORSETMAKER> 
       <RCURLYBRACE tokenValue="}" tokenLine="12" tokenColumn="41"/> 
       </ATOM> 
      </TEST> 
      </TESTLIST_STAR_EXPR> 
     </EXPRESSION_STMT> 
     </SIMPLE_STMT> 
    </STMT_LIST> 
    <NEWLINE tokenValue=" 
" tokenLine="12" tokenColumn="42"/> 
    </STATEMENT> 
    <STATEMENT tokenValue="selection" tokenLine="14" tokenColumn="0"> 
    <STMT_LIST tokenValue="selection" tokenLine="14" tokenColumn="0"> 
     <SIMPLE_STMT tokenValue="selection" tokenLine="14" tokenColumn="0"> 
     <EXPRESSION_STMT tokenValue="selection" tokenLine="14" tokenColumn="0"> 
      <TESTLIST_STAR_EXPR tokenValue="selection" tokenLine="14" tokenColumn="0"> 
      <TEST tokenValue="selection" tokenLine="14" tokenColumn="0"> 
       <ATOM tokenValue="selection" tokenLine="14" tokenColumn="0"> 
       <NAME tokenValue="selection" tokenLine="14" tokenColumn="0"> 
        <IDENTIFIER tokenValue="selection" tokenLine="14" tokenColumn="0"/> 
       </NAME> 
       </ATOM> 
      </TEST> 
      </TESTLIST_STAR_EXPR> 
      <ASSIGN tokenValue="=" tokenLine="14" tokenColumn="10"/> 
      <TESTLIST_STAR_EXPR tokenValue="'mails=s%'" tokenLine="14" tokenColumn="12"> 
      <TEST tokenValue="'mails=s%'" tokenLine="14" tokenColumn="12"> 
       <M_EXPR tokenValue="'mails=s%'" tokenLine="14" tokenColumn="12"> 
       <ATOM tokenValue="'mails=s%'" tokenLine="14" tokenColumn="12"> 
        <STRING tokenValue="'mails=s%'" tokenLine="14" tokenColumn="12"/> 
       </ATOM> 
       <MOD tokenValue="%" tokenLine="14" tokenColumn="23"/> 
       <POWER tokenValue="mails" tokenLine="14" tokenColumn="24"> 
        <ATOM tokenValue="mails" tokenLine="14" tokenColumn="24"> 
        <NAME tokenValue="mails" tokenLine="14" tokenColumn="24"> 
         <IDENTIFIER tokenValue="mails" tokenLine="14" tokenColumn="24"/> 
        </NAME> 
        </ATOM> 
        <TRAILER tokenValue="." tokenLine="14" tokenColumn="29"> 
        <DOT tokenValue="." tokenLine="14" tokenColumn="29"/> 
        <NAME tokenValue="Emails" tokenLine="14" tokenColumn="30"> 
         <IDENTIFIER tokenValue="Emails" tokenLine="14" tokenColumn="30"/> 
        </NAME> 
        </TRAILER> 
       </POWER> 
       </M_EXPR> 
      </TEST> 
      </TESTLIST_STAR_EXPR> 
     </EXPRESSION_STMT> 
     </SIMPLE_STMT> 
    </STMT_LIST> 
    </STATEMENT> 
    <EOF tokenValue="EOF" tokenLine="14" tokenColumn="36"/> 
</FILE_INPUT> 

的問題是,我要趕在mailDic字典中的條目,但不能從選擇。

+0

請顯示您正在嘗試使用此XPath的XML數據以及您嘗試查找哪些部分。看看[mcve],這是我們能夠幫助你的最低要求。 – Abel

+0

我已將它添加到主要問題 – Krasnars

回答

0

您寫道:

雖然我得到的所有硬編碼的郵件,我也得到郵件列表,這是不硬編碼的,但在該行qoutes。

鑑於你的輸入數據,當前的表達式返回:

<STRING tokenColumn="12" tokenLine="12" tokenValue="'John'"/> 
<STRING tokenColumn="21" tokenLine="12" tokenValue="'[email protected]'"/> 
<STRING tokenColumn="12" tokenLine="14" tokenValue="'mails=s%'"/> 

「郵件列表」這個詞,如果我認爲它是在地方,它現在說「mailDic」不會發生在你的數據,但,那麼你可以用這個修復:

//TESTLIST_STAR_EXPR[ 
    contains(@tokenValue,"mail") 
    and not(@tokenValue = 'mailList')] 
/.. 
//STRING[contains(@tokenValue,"'")] 

如果是從要過濾掉,而不是原來的輸入s%,您可以使用以下命令:

//TESTLIST_STAR_EXPR[contains(@tokenValue,"mail")] 
/.. 
//STRING[ 
    contains(@tokenValue,"'") 
    and not contains(@tokenValue, 's%')] 

否則,請更新輸入匹配你的問題,因爲它失敗,那麼從that link I gave you的「覈實」,即你的問題,我看不到,因爲它發展順利,什麼不順心;)。

+1

您的第二個示例與我的案例相匹配,謝謝:) – Krasnars

+0

您是否知道,如果有我可以循環查看字符串列表? 相反的: // STRING [包含(@ tokenValue, 'a')和含有(@tokenValue, 'B')] 我想做某事像這樣:// STRING [包含(@tokenValue ,['a','b'])] – Krasnars

+0

@Krasnars,在XPath 2.0中,您可以像'// STRING [ )滿足contains(。,$ tok)]',在XPath 1.0中,沒有這樣的構造,所以如果你想用XPath 1.0來做到這一點,你將不得不求助於XSLT。 – Abel