python - 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
解决方案
请将您的正则表达式更改为 ,
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'>
推荐阅读
- angular - how to hide the folder path from webpack require() in Angular
- twilio - 通过 twilio 向 whatsapp 发送对话流卡失败
- django - 如何从 django 中的登录表单中清除建议
- python - 在 python 中优化分桶箱中的分布
- android - 带有重定向 URL 的 Kotlin WebView loadUrl()
- python - 在 seaborn 中为时间序列图的一部分着色
- python-3.x - 如何从 SequenceExample TFRecord 创建窗口多元数据集
- android - 如何将 MimeType 添加到序列化文件输出中,以便将其归类为特定文件格式
- ios - 滚动我的应用程序时如何在 IOS 中禁用 toch 事件(Cordova)
- python - 在matplotlib中计算曲线python每个点的切线