Py学习  »  Python

Python-使用带位置的正则表达式提取和拆分字符串

TheDataGuy • 1 年前 • 516 次点击  

我有一根这样的绳子。

'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);

我想使用正则表达式提取以下项。我试了几下,但都不管用。

2022-05-08T04:18:43Z -时间戳

dev -数据库名称

test -数据库用户

alter table my_table alter column string type varchar(16) -询问

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/133914
 
516 次点击  
文章 [ 1 ]  |  最新文章 1 年前
Nick
Reply   •   1 楼
Nick    1 年前

根据你给出的格式,这个正则表达式应该做你想做的事情。

'(?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