社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

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

TheDataGuy • 3 年前 • 1346 次点击  

我有一根这样的绳子。

'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
 
1346 次点击  
文章 [ 1 ]  |  最新文章 3 年前
Nick
Reply   •   1 楼
Nick    3 年前

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

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