Регулярное выражение Python и несколько именованных групп, найденных в строке - PullRequest
0 голосов
/ 15 февраля 2019

Я хочу извлечь определенную информацию из 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

Спасибо за любую подсказку

edit

В конце концов, следующий код работает нормально

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

печатает

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

1 Ответ

0 голосов
/ 15 февраля 2019

Пожалуйста, измените свое регулярное выражение на,

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'>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...