我需要解析DHCP日志数据,如下所示:
2013-11-15 09:42:02 localhost dhcpd: DHCPACK on 10.51.1.242 to 00:1e:8c:21:83:a0 (Hostname Unsuitable for Printing) via eth2
我写了一个正则表达式模式来收集所有匹配的值,它是这样的:
(?P<date>[\d{2,4}-]*[\d{2}:\s]*)\s(?P<host>\S+)\s*(?P<facility>\s*\S*:)\s*((?P<action>DHCP*\S*)\s*|(?P<mac>([0-9A-Fa-f]{2}[:-]){5}([0-9A-Fa-f]){2})\s*|(?P<message>\S*)\s*|(\s*))*
在re.search(regex, text).groupdict()
命令后,它给了我这个词:
{u'facility': u'dhcpd:', u'host': u'localhost', u'date': u'2013-11-15 09:42:02', u'mac': u'00:1e:8c:21:83:a0', u'action': u'DHCPACK', u'message': u''}
正如所看到的那样,每个单独的项目都返回正确的匹配,但是消息部分放在括号中,我尝试了太多的变化来获得它。 (?P<message>\((.*)\))
模式工作正常并返回{u'message': u'(Hostname Unsuitable for Printing)'}
如果我将其用作单个,否则它根本不匹配。
我坚持这一点,真的需要帮助。
答案 0 :(得分:1)
我不确定你为什么要使用这么多|
个操作数。我将它们剥离出来并使用\s+
作为分隔符和$
来匹配字符串的结尾作为消息的分隔符,但这对我有用:
import re
text = r'2013-11-15 09:42:02 localhost dhcpd: DHCPACK on 10.51.1.242 to 00:1e:8c:21:83:a0 (Hostname Unsuitable for Printing) via eth2'
my_regexp = r'^(?P<date>[\d{2,4}-]*[\d{2}:\s]*)\s+(?P<host>\S+)\s+(?P<facility>\s*\S*):(\s+(?P<action>DHCP*\S*).+(?P<mac>([0-9A-Fa-f]{2}[:-]){5}([0-9A-Fa-f]){2})\s+(?P<message>.*))*$'
print re.search( my_regexp, text).groupdict()
输出:
{'facility': 'dhcpd', 'host': 'localhost', 'date': '2013-11-15 09:42:02', 'mac': '00:1e:8c:21:83:a0', 'action': 'DHCPACK', 'message': '(Hostname Unsuitable for Printing) via eth2'}