首页 > 解决方案 > Python 正则表达式和在行中找到的几个命名组

问题描述

我想从 CFT(将文件从任何操作系统复制到另一个操作系统的工具)中提取一些特定信息。我解析命令“cftutil listcat content=full”的输出

我想提取本地和远程文件中的日期、小时数、记录数...

例如,我得到像

Records      NRECS    = 49016                 Records  NREC     = 49016

我想在 NRECS 或 NREC 之后提取值

或类似的线条

Begin date   DATEB    = 15/02/2019   End date DATEE    = 15/02/2019
Begin time   TIMEB    = 12:18:21.05  End time TIMEE    = 12:18:23.16

我想要转移开始和结束的日期和时间

我的正则表达式只获得该行中的第一个匹配项

我的程序

import re
reg = r"""
(^.*)DIRECT\s+=\s(?P<direct>[A-Z]{4})
|
(^.*)DATEE\s+=\s(?P<date_end>\d{2}\/\d{2}\/\d{4})
|
(^.*)DATEB\s+=\s(?P<date_deb>\d{2}\/\d{2}\/\d{4})
|
(^.*)TIMEB\s+=\s(?P<hour_deb>\d{2}:\d{2}:\d{2}.\d{2})
|
(^.*)TIMEE\s+=\s(?P<hour_end>\d{2}:\d{2}:\d{2}.\d{2})
|
(^.*)NREC\s+=\s(?P<nb_records_loc>\d+)
|
(^.*)NRECS\s+=\s(?P<nbrecords_rem>\d+)
"""
pat1 = re.compile(reg,re.VERBOSE)
with open("CFT_FULL.TXT","r") as a:
    source = a.read().split('\n')
    for i, lin in enumerate(source):
        if (" FNAME" in lin or " NFNAME" in lin):
            print '\n'.join(source[i+1:i+2])
        m = re.search(pat1, lin)
        if m is not None:
            print m.lastgroup, "---> ", m.group(m.lastindex)
        if "JOBNAME" in lin :
            print lin,'\n'

编辑:部分输出

date_end --->  06/02/2019
hour_deb --->  08:19:48.63
nb_records_loc --->  139

但我应该有

date_deb --->  06/02/2019
date_end --->  06/02/2019
hour_deb --->  08:19:48.63
hour_end --->  08:19:49.52

感谢您的任何提示

编辑

最终,以下代码可以正常工作

m = re.search(pat1, lin) if m is not None: for x in re.finditer(pat1,lin): print x.lastgroup,"--->", x.group(x.lastindex)

它打印

date_deb ---> 06/02/2019 date_end ---> 06/02/2019 hour_deb ---> 08:19:58.64 hour_end ---> 08:19:58.75 nbrecords_rem ---> 62 nbrecords_loc ---> 62

标签: pythonregex

解决方案


请将您的正则表达式更改为 ,

reg = r"""
DIRECT\s+=\s(?P<direct>[A-Z]{4})
|
DATEE\s+=\s(?P<date_end>\d{2}\/\d{2}\/\d{4})
|
DATEB\s+=\s(?P<date_deb>\d{2}\/\d{2}\/\d{4})
|
TIMEB\s+=\s(?P<hour_deb>\d{2}:\d{2}:\d{2}.\d{2})
|
TIMEE\s+=\s(?P<hour_end>\d{2}:\d{2}:\d{2}.\d{2})
|
NREC\s+=\s(?P<nb_records_loc>\d+)
|
NRECS\s+=\s(?P<nbrecords_rem>\d+)
"""

此外,由于 re.search() 返回匹配项的第一次出现,我建议使用 re.finditer()。例如。对于以下字符串:

Begin date   DATEB    = 15/02/2019   End date DATEE    = 15/02/2019
Begin time   TIMEB    = 12:18:21.05  End time TIMEE    = 12:18:23.16

预期的输出将是,

>>> for x in re.finditer(pat1,above_string):
    print(x)


<_sre.SRE_Match object; span=(13, 34), match='DATEB    = 15/02/2019'>
<_sre.SRE_Match object; span=(46, 67), match='DATEE    = 15/02/2019'>
<_sre.SRE_Match object; span=(82, 104), match='TIMEB    = 12:18:21.05'>
<_sre.SRE_Match object; span=(115, 137), match='TIMEE    = 12:18:23.16'>

推荐阅读