代码之家  ›  专栏  ›  技术社区  ›  TheDataGuy

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

  •  0
  • TheDataGuy  · 技术社区  · 2 年前

    我有一根这样的绳子。

    '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) -询问

    1 回复  |  直到 2 年前
        1
  •  2
  •   Nick SamSmith1986    2 年前

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

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