Как извлечь несколько шаблонов из огромного файла с повторяющимися блоками данных? - PullRequest
0 голосов
/ 20 февраля 2019

У меня есть текстовый файл, который содержит данные, как показано ниже.Из этих множественных данных мне нужно извлечь конкретные данные, скажем 10238679000 C-73652 , 5123 & 23154, 25734. Это C-73652 может / не может присутствовать в каждом наборе.

How can I achieve this through regex ? I feel, regex is the best option.
Or Is there any better approach for this ?

test_file.txt

Recieved request        #STARTS
Data getting generated for : "time":[10238679000]
.................   #CAN BE ANYTHING, BUT FEW LINES HERE
Starting data from 10238679000
A-123456 data 679720 for instance:  [1452]
C-73652 data 5123 for instance:  [23154, 25734]
B-967845 data 73421 for instance:  [37451]
G-809573 data 38456 for instance:  [92673]     #ENDS
Recieved request     #NEXT SET STARTS
may be same data as above or different data
In general it can have multiple set of such data
..............................   #CAN BE ANYTHING, BUT FRW LINES HERE
..............................
# SECOND SET ENDS
Recieved request  #REPEATS AGAIN

Как я могу решить эту проблему с помощью регулярных выражений?

Пример вывода:

At 10238679000, C-73652 generated data of 5123 units with instance 23154, 25734

Если C-73652 присутствует в другом наборе, он должен генерировать, как указано вышедля этого конкретного набора данных.

Ответы [ 2 ]

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

На самом деле в вашем вопросе, к сожалению, отсутствуют некоторые детали.Итак, я позволил себе сделать некоторые предположения.Следующее регулярное выражение извлекает вторую строку для каждого фрагмента данных.Группа 1 фиксирует 10238679000, значение времени, а группа 2 фиксирует C-73652 data 5123 for instance: [23154, 25734].Я предположил, что вы хотите извлечь только строку между начальными символами A и B.

re.findall(r'(?:Starting data from )([\d]+)\nA-.*?\n(.*)\nB', test_file)

Проверьте это в действии здесь

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

Вы можете использовать отдельное регулярное выражение для соответствия строке заголовка и сохранить время начала.Затем вы можете использовать регулярные выражения для каждой из строк.

Starting data from (\d*) должно работать для начальной строки

и ([A-Z]-\d*)?\s*data\s*(\d*).*:\s*\[([\d*, ]*)\] для данных.

Driver Program(не самая чистая / лучшая реализация, просто используется для демонстрации):

import re

test_data = """
Starting data from 10238679000
A-123456 data 679720 for instance:  [1452]
C-73652 data 5123 for instance:  [23154, 25734]
B-967845 data 73421 for instance:  [37451]
G-809573 data 38456 for instance:  [92673]     
data 38456 for instance:  [92673]
blah blah
Starting data from 121212
A-123456 data 679720 for instance:  [1452]
C-73652 data 5123 for instance:  [23154, 25734, 122121]]
B-967845 data 73421 for instance:  [37451]
G-809573 data 38456 for instance:  [92673]     
data 38456 for instance:  [92673]

"""

begin_rex = re.compile(r'Starting data from (\d*)')
line_rex = re.compile(r'([A-Z]-\d*)?\s*data\s*(\d*).*:\s*\[([\d*, ]*)\]')

current_time, match_line_rex = '', False
for line in test_data.splitlines():
    if not match_line_rex:
        begin = begin_rex.findall(line)
        if begin:
            current_time = int(begin[0])
            match_line_rex = True
    else:
        data = line_rex.findall(line)
        if data:
            data = list(data[0])
            data[2] = ' & '.join([dat.strip() for dat in data[2].split(',')])
            print '{}\t{}'.format(current_time, '\t'.join(data))
        else:
            match_line_rex = False

Вывод:

10238679000 A-123456    679720  1452
10238679000 C-73652 5123    23154 & 25734
10238679000 B-967845    73421   37451
10238679000 G-809573    38456   92673
10238679000     38456   92673
121212  A-123456    679720  1452
121212  C-73652 5123    23154 & 25734 & 122121
121212  B-967845    73421   37451
121212  G-809573    38456   92673
121212      38456   92673
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...