我试图在Python中创build一个正则expression式来捕获winerror.h和ntstatus.h中的所有最后错误,HRESULT和NTSTATUS defenitions:
例如,对于这个文本:
// // 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)
我觉得这足够接近:
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']
这是我最终弄清楚和使用的正则表达式:
要捕获winerror.h
所有最新错误和HRESULT定义:
//\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
捕获ntstatus.h
所有NTSTATUS定义:
//\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\)
之后,我还通过用换行符替换//
来格式化描述(消息文本)。