我有一个来自其中一个日志文件的字符串,如下所示。
pf_string = "2018-02-01 00:54:49,285 [210.67.123.00] [ABC,CDE,sfv4_ABC.,dbPool5,11689563,fp2871,en_US] UNKNOWN-UNKNOWN EVENT-UNKNOWN-UNKNOWN-pc4bcf46t-20180201005446-663570 2994 770 3199 168 26 [Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; ABC-IE11; rv:11.0) like Gecko] 3677610951-0 PERFORMANCE PM_REVIEW FORM_DETAIL [[95211KB 480ms 460ms 20ms 212KB 0KB 118KB 57KB 0 0 ]] 74 139 - - - - "
现在我想提取如下的模式:
Module_id -> PERFORMANCE
Page Name -> PM_REVIEW
Page Qualifier -> FORM_DETAIL
这是一个正则表达式,如下所示:
perfLogPatternPage = re.compile('(?P<module_id>\w+)\s(?P<page_name>\w+)\s(?P<page_qualifier>\w+)\s\[\[')
print perfLogPatternPage.match(pf_string).group('module_id')
print perfLogPatternPage.match(pf_string).group('page_name')
print perfLogPatternPage.match(pf_string).group('page_qualifier')
但这似乎不起作用并给出正确的结果。
有人可以提出错误吗?
答案 0 :(得分:2)
立即应用re.search()
功能就足够了:
import re
pf_string = "2018-02-01 00:54:49,285 [210.67.123.00] [ABC,CDE,sfv4_ABC.,dbPool5,11689563,fp2871,en_US] UNKNOWN-UNKNOWN EVENT-UNKNOWN-UNKNOWN-pc4bcf46t-20180201005446-663570 2994 770 3199 168 26 [Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; ABC-IE11; rv:11.0) like Gecko] 3677610951-0 PERFORMANCE PM_REVIEW FORM_DETAIL [[95211KB 480ms 460ms 20ms 212KB 0KB 118KB 57KB 0 0 ]] 74 139 - - - - "
m = re.search(r'(?P<module_id>\w+)\s+(?P<page_name>\w+)\s+(?P<page_qualifier>\w+)\s(?=\[\[.)', pf_string)
module_id, page_name, page_qualifier = m.groups()
答案 1 :(得分:1)
你可以试试这个:
import re
pf_string = "2018-02-01 00:54:49,285 [210.67.123.00] [ABC,CDE,sfv4_ABC.,dbPool5,11689563,fp2871,en_US] UNKNOWN-UNKNOWN EVENT-UNKNOWN-UNKNOWN-pc4bcf46t-20180201005446-663570 2994 770 3199 168 26 [Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; ABC-IE11; rv:11.0) like Gecko] 3677610951-0 PERFORMANCE PM_REVIEW FORM_DETAIL [[95211KB 480ms 460ms 20ms 212KB 0KB 118KB 57KB 0 0 ]] 74 139 - - - -"
results = dict(zip(['Module_id', 'Page Name', 'Page Qualifier'], re.findall('(?<=\-\d)[a-zA-Z\s_]+(?=\[\[\d)', pf_string)[0].split()))
输出:
{'Module_id': 'PERFORMANCE', 'Page Qualifier': 'FORM_DETAIL', 'Page Name': 'PM_REVIEW'}
答案 2 :(得分:0)
你可以这样做:
\d+-\d+\s+(?P<module_id>[A-Z_]+)\s+(?P<page_name>[A-Z_]+)\s+(?P<page_qualifier>[A-Z_]+)
\d+-\d+\s+
匹配一个或多个数字,后跟-
,后跟一个或多个数字,然后是一个或多个空格
每个命名的捕获组匹配一个或多个大写字母 字符或下划线
捕获的组之间的\s+
匹配一个或多个空格
示例:强>
In [12]: rcomp = re.compile(r'\d+-\d+\s+(?P<module_id>[A-Z_]+)\s+(?P<page_name>[A-Z_]+)\s+(?P<page_qualifier>[A-Z_]+)')
In [13]: out = rcomp.search(pf_string)
In [14]: out.group('module_id')
Out[14]: 'PERFORMANCE'
In [15]: out.group('page_name')
Out[15]: 'PM_REVIEW'
In [16]: out.group('page_qualifier')
Out[16]: 'FORM_DETAIL'
答案 3 :(得分:0)
您的正则表达式需要一些更正:
^
)开始。[
以外的一系列字符。[
char。]
以外的一系列字符。]
char。-
字符和另一个序列
空间。因此整个正则表达式如下所示:
^(?:[^\[]+\[[^\]]+\]){3}\s+[-\d]+\s+(?P<module_id>\w+)\s+(?P<page_name>\w+)\s+(?P<page_qualifier>\w+)
有关工作示例,请参阅https://regex101.com/r/e048Q3/1