Skip to main content
 首页 » 编程设计

Python 正则表达式和在线找到的几个命名组

2024年11月24日28Renyi-Fan

我想从 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) 如果 m 不是无: 对于 re.finditer(pat1,lin) 中的 x: 打印 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

请您参考如下方法:

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

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