2017-11-08 13 views
2

私はすべての最後のエラーを捕捉するためにPythonで正規表現を作成しようとしていると定義、& ntstatus.h WINERROR.HからHRESULTとNTSTATUS defenitions:解析WINERROR.H&ntstatus.hステータス/正規表現

  • http://www.carrona.org/winerror.html
  • 、このテキストのために:

    // 
    // MessageId: NTE_BAD_PROV_TYPE 
    // 
    // MessageText: 
    // 
    // Invalid provider type specified. 
    // More data is avaiable on bla bla. 
    // 
    #define NTE_BAD_PROV_TYPE    _HRESULT_TYPEDEF_(0x80090014L) 
    

    私はキャプチャしたい:

    ('Invalid provider type specified. More data is avaiable on bla bla.', 'NTE_BAD_PROV_TYPE', 0x80090014)


    同じことがntstatus.hのために行く:

    // 
    // MessageId: STATUS_NOT_ALL_ASSIGNED 
    // 
    // MessageText: 
    // 
    // Indicates not all privileges or groups referenced are assigned to the caller. 
    // This allows, for example, all privileges to be disabled without having to know exactly which privileges are assigned. 
    // 
    #define STATUS_NOT_ALL_ASSIGNED   ((NTSTATUS)0x00000106L) 
    
  • 答えて

    0

    これは私が考え出すと使用して終了正規表現です:

    をすべて最終エラーにwinerror.hで& HRESULT定義キャプチャするには:すべてのNTSTATUSの定義をキャプチャするには

    //\sMessageText:[\n\r]+//\s*[\n\r]+ 
    (?P<message_text>//.*?//\n)*.*? 
    #define\s(?P<status_name>[A-Za-z0-9]+) 
    \s+(?:_HRESULT_TYPEDEF_\(|NDIS_ERROR_TYPEDEF_\()? 
    (?P<status_value>(?:0[xX])?[A-Fa-f0-9]+)L 
    

    をin ntstatus.h

    //\sMessageText:[\n\r]+//\s*[\n\r]+ 
    (?P<message_text>//.*?//\n)*.*? 
    #define\s(?P<status_name>[A-Za-z0-9]+) 
    \s+\(\(NTSTATUS\)(?P<status_value>0[xX]?[A-Fa-f0-9]+)L\) 
    

    また、//を改行に置き換えて、説明(メッセージテキスト)をフォーマットします。

    0

    私は、これは十分近いと思う:

    re.findall(r"(?<=//)(?:Message\w{2,4}:)? ?(.+)?\n", text)+list(re.search(r"(0x\d+)", text).groups())

    ['NTE_BAD_PROV_TYPE', '', 'Invalid provider type specified.', 'More data is avaiable on bla bla.', '0x80090014']