根据你给出的格式,这个正则表达式应该做你想做的事情。
'(?P<ts>\d{4}-\d\d-\d\dT\d\d:\d\d:\d\dZ).*?\bdb=(?P<db>\S*).*?\buser=(?P<user>\S*).*?LOG:\s+(?P<query>.*?);?$
它使用命名的捕获组来匹配字符串的时间戳、数据库、用户和查询部分。时间戳假定为字符串格式,即。
yyyy-mm-ddThh:mm:ssZ
; 数据库和用户字段是适当标记后面的任何非空格字符,查询是从
LOG:
直到尾随
;
最后一行。
Regex demo
在python中可以这样使用:
import re
str = "'2022-05-08T04:18:43Z UTC [ db=dev user=test pid=1073922359 userid=100 xid=2063 ]' LOG: alter table my_table alter column string type varchar(16);"
m = re.match(r"'(?P<ts>\d{4}-\d\d-\d\dT\d\d:\d\d:\d\dZ).*?\bdb=(?P<db>\S*).*?\buser=(?P<user>\S*).*?LOG:\s+(?P<query>.*?);?$", str)
if m is not None:
print(m.groupdict())
输出:
{
'ts': '2022-05-08T04:18:43Z',
'db': 'dev',
'user': 'test',
'query': 'alter table my_table alter column string type varchar(16)'
}
笔记
这个正则表达式假定
db
标签在标签前面
user
标签如果情况可能并非如此,您可以通过将这些捕获组放在前瞻性头部来解决这一问题,例如。
'(?P<ts>\d{4}-\d\d-\d\dT\d\d:\d\d:\d\dZ)(?=.*?\bdb=(?P<db>\S*))(?=.*?\buser=(?P<user>\S*)).*?LOG:\s+(?P<query>.*?);?$
这将适用于以下字符串:
'2022-05-08T04:18:43Z UTC [ user=test db=dev pid=1073922359 userid=100 xid=2063 ]' LOG: alter table my_table alter column string type varchar(16);
Demo on regex101