Как извлечь части журналов на основе идентификационных номеров? - PullRequest
1 голос
/ 19 сентября 2019

Я пытаюсь извлечь и предварительно обработать данные журнала для варианта использования.

Например, журнал состоит из номеров проблем с информацией для каждого ID ниже.Каждый элемент начинается с:

#!#!#identification_number###96245#!#!#change_log###
action
action1
change
#!#!#attribute###value_change
#!#!#attribute1###status_change
#!#!#attribute2###<None>
#!#!#attribute3###status_change_fail
#!#!#attribute4###value_change
#!#!#attribute5###status_change

#!#!#identification_number###96246#!#!#change_log###
action
change
change1
action1
#!#!#attribute###value_change
#!#!#attribute1###status_change_fail
#!#!#attribute2###value_change
#!#!#attribute3###status_change
#!#!#attribute4###value_change
#!#!#attribute5###status_change

Я извлек идентификационные номера и сохранил их в виде файла .csv:

f = open(r'C:\Users\reszi\Desktop\Temp\output_new.txt', encoding="utf8")
change_log = f.readlines()

number = re.findall('#!#!#identification_number###(.+?)#!#!#change_log###', change_log)

Теперь я пытаюсь добиться того, чтобы для каждого идентификаторав файл .csv я могу добавить соответствующий контент журнала:

action
change
#!#!#attribute###

Поскольку я довольно плохо знаком с Python и только начал работать с regex несколько дней назад, я надеялся на некоторую помощь.

Каждый журнал для идентификатора начинается с "#!#!identification_number###" и заканчивается "#!#!attribute5### <entry>".

Я пробовал следующий код, но результат пуст:

In:
x = re.findall("\[^#!#!#identification_number###((.|\n)*)#!#!#attribute5###((.|\n)*)$]", str(change_log))

In: 
print(x)

Out:
[]

Ответы [ 2 ]

1 голос
/ 19 сентября 2019

Попробуйте:

pattern='entification_number###(.+?)#!#!#change_log###(.*?)#!#!#id'

re.findall(pattern, string+'#!#!#id', re.DOTALL)

Флаг dotall делает совпадение точек новой строкой, поэтому, надеюсь, во второй группе захвата вы найдете журналы.

Если вы хотите получить атрибутыдля каждого идентификационного номера вы можете проанализировать журналы (полученные для поиска выше) каждого идентификационного номера со следующим:

pattern='#!#!#attribute(.*?)###(.*?)#!#'

re.findall(pattern, string_for_each_log_match+'#!#', re.DOTALL)

0 голосов
/ 24 сентября 2019

Если вы вводите каждый идентификатор в регулярное выражение при поиске, используя string.format(), вы можете получить строки, которые содержат правильный список изменений.

with open(r'path\to\csv.csv', 'r') as f:
    ids = f.readlines()

with open(r'C:\Users\reszi\Desktop\Temp\output_new.txt', encoding="utf8") as f:
    change_log = f.readlines()

matches = {}
for id_no in ids:
    for i in range(len(change_log)):
        reg = '#!#!#identification_number###({})#!#!#change_log###'.format(id_no)
        if re.search(reg, change_log[i]):
            matches[id_no] = i
            break

Это создаст словарь со структурой {id_no:line_no,...}.Поэтому, когда у вас есть все строки, указывающие, где начинается каждый журнал, вы можете получить нужные вам строки, следующие за этими строками.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...