我有一个SonicWall syslog文件,格式如下:
<134>id=firewall sn=C0EAE470F7D0 time="2014-08-13 04:31:27" fw=10.2.3.4 pri=6 c=1024 m=537 msg="Connection Closed" n=301541 src=172.16.1.43:50581:X0 dst=172.16.1.1:192:X0 proto=udp/192 sent=46
Run Code Online (Sandbox Code Playgroud)
我正在尝试创建一个正则表达式,它将返回在=符号上拆分的元组列表.如果值包含空格,则它将具有双引号.我不关心返回的值是否返回引号,只要返回带有空格的整个值.例如,我希望时间键包含日期和时间.期望的输出:
("<134>id","firewall"), ("sn","C0EAE470F7D0"), ("time", '"2014-08-13 04:31:27"')
("fw","1.2.3.4"), ("pri","6"), ... ("msg", '"Connection Closed"'), ("n", "301541")
("src","172.16.1.43:50581:X0"), ... ("sent", "46")
Run Code Online (Sandbox Code Playgroud)
这是我到目前为止所遇到的,但遇到带双引号的字段时失败.此外,不返回在这种情况下"发送"的最后一个字段.我已经尝试了RE几个小时尝试各种组合,但只是不能让它工作.任何帮助将不胜感激.
import re
fname = "syslog.log"
with open(fname) as fp: lines = fp.read().splitlines()
q = re.compile('(.*?)=(.*?)[\s"]',re.S|re.M)
for line in lines:
print(line)
key_val = q.findall(line)
print(key_val)
Run Code Online (Sandbox Code Playgroud)
这是此代码返回的内容:
[('<134>id', 'firewall'), ('sn', 'C0EAE470F7D0'), ('time', ''),
('2014-08-13 04:31:27" fw', '10.2.3.4'), ('pri', '6'),
('c', '1024'), ('m', '537'), ('msg', ''),
('Connection Closed" n', '301541'), ('src', '172.16.1.43:50581:X0'),
('dst', '172.16.1.1:192:X0'), ('proto', 'udp/192')]
Run Code Online (Sandbox Code Playgroud)
如果使用正则表达式无法实现这一点,那么在Python 3.3中实现所需结果的最佳方法是什么?
http://regex101.com/r/wS5lX2/3
(.+?)=("[^"]*"|\S*)\s*
它能做什么
如果您还想删除匹配项周围的引号,则可以使用它
http://regex101.com/r/wS5lX2/4
(.+?)=(?:"(.*?)(?<!\\)"|(\S*))\s*
它从匹配字符串中删除双引号.键将是组1,值将是组2或3.此外,它允许您在引用值中包含反斜杠转义引号.