Шаблоны регулярных выражений для извлечения информации из журналов событий - PullRequest
0 голосов
/ 22 октября 2019

Я работаю над данными журнала событий, так как мы все знаем их неструктурированные данные и должны извлечь важные фрагменты информации из этих журналов для лучшей визуализации. Эти данные разделены табуляцией, я создал фрейм данных из этих журналов событий, а также ожидаемый вывод. Имя столбца Event_message - это необработанное сообщение журнала событий, а столбцы CtrJb_ID, Prcs_ID, LotID, Wafer_ID - это столбцы, которые я хотел бы извлечь из этих журналов. Если условие не выполняется, то я бы хотел, чтобы строка была None или была пустой. Например, в одном случае, если идентификатор лота существует, извлеките идентификатор лота, а если нет, то нет.

data = {'Timestamp':['2009/8/22 08:02:29.862', '2009/8/22 08:02:30.706','2008/08/22 08:02:33.207','2008/08/22 08:02:37.551'], 
       'Event_Message':["2009/8/22 08:02:29.862 2009/8/22 08:02:29.862  123456  ControlJobStateTransition1  CWControlJobManager 'ControlJob named XYZ12345-20090822-0005 was created and is in the QUEUED state.'   []  ['EventVariable ControlJobID    0   true    XYZ12345-20090822-0005''    ControlJobID'   'EventVariable  DataCollectionPlan  0   true    ",
                        "2009/8/22 08:02:30.706 2009/8/22 08:02:30.315  123456  PRJobStateChange    XYZ12ProcessJobManager  'Process Job 200908221102-2R34567.000-01 has changed state to PRJOBACTIVE/SETUP.'   []  ['EventVariable ProcessJobID    0   true    ''200908221102-2R34567.000-01'' ProcessJobID'   'EventVariable  ProcessJobState 0   true    ''1''",
                        "2008/08/22 08:02:33.207    2008/08/22 08:02:33.175 123456789   DAExtendPerResourceDAWaferCenterOffsetB TransferChamberSlotValvePM4 'DAPerResource EXTEND'  []  ['StatusVariable    Source  0   true    ''TransferChamber-EndEffector2''    Source' 'StatusVariable Destination 0   true    ''PM4'' Destination'    'StatusVariable WaferID 0   true    ''1A234568ABC2''    WaferID'    'StatusVariable LotID   0   true    ''200908221036-2R34567.000-01'' LotID'",
                        "2008/08/22 08:02:37.551    2008/08/22 08:02:37.404 12345678    RecipeStarted   PM4 'Started processing recipe AB0-Z-65XYZ-ABCDE12XYZ1-2R34567000 on material 1A234568ABC2. '   []  ['StatusVariable    RecipeName  0   true    ''PM4-P-14LPP-PEBNS31JFA1-8R91721000''  RecipeName' 'StatusVariable MaterialID  0   true    ''1A234568ABC2''    MaterialID' 'StatusVariable JobID   0   true    ''201910021036-2R34567.000-01'' JobID'  'EventVariable  WacID   0   true    ''''    WacID'  'StatusVariable LotID   0   true    ''2R34567.000'' LotID'  'StatusVariable SlotID  0   true    ''11"],
       'CtrJb_ID': ['XYZ12345-20090822-0005', None, None, None],
       'Prcs_ID': [None, '200908221102-2R34567.000', None, None],
       'LotID': [None, None, '200908221036-2R34567.000-01', '2R34567.000'],
       'Wafer_ID': [None, None, '1A234568ABC2', None ]}

df= pd.DataFrame(data)

Я прочитал это сообщение журнала событий построчно, а затем попытался извлечь его, используя шаблоны регулярных выражений, но безуспешно. Ниже приведен код, который я пробовал до сих пор.

import pandas as pd
import re
f = open ("C:\ABCD\XYZ\egfh_ijk_lmn\log2009082212.txt")
lines = f.readlines()
for line in lines:
    print (line)


lot= re.compile(r'LotID\s+\d\s+\w+\s+(.*)\s+LotID')

for line in lines:
    if lot.search(str(line)):
        print(lot)
    else:
        print(None)

Выход:

None
None
None
None
None
re.compile('LotID\\s+\\d\\s+\\w+\\s+(.*)\\s+LotID')
re.compile('LotID\\s+\\d\\s+\\w+\\s+(.*)\\s+LotID')
None
None
None
None
None
re.compile('LotID\\s+\\d\\s+\\w+\\s+(.*)\\s+LotID')
None
None
re.compile('LotID\\s+\\d\\s+\\w+\\s+(.*)\\s+LotID')

Ответы [ 2 ]

1 голос
/ 23 октября 2019

Поскольку вы запрашиваете рабочий фрагмент:

import re
test = "2008/08/22 08:02:33.207    2008/08/22 08:02:33.175 123456789   DAExtendPerResourceDAWaferCenterOffsetB TransferChamberSlotValvePM4 'DAPerResource EXTEND'  []  ['StatusVariable    Source  0   true    ''TransferChamber-EndEffector2''    Source' 'StatusVariable Destination 0   true    ''PM4'' Destination'    'StatusVariable WaferID 0   true    ''1A234568ABC2''    WaferID'    'StatusVariable LotID   0   true    ''200908221036-2R34567.000-01'' LotID'"
lot = re.compile(r"LotID[^']+''([\d\-.A-Z]*)''[^']+LotID")
match = lot.search(test)
if (match):
    print(match.group(1))
else:
    print "None"

Вывод:

200908221036-2R34567.000-01
0 голосов
/ 23 октября 2019

Для такого рода задач не нужно использовать упреждающий просмотр. Неиспользование их позволяет использовать квантификаторы. В вашей версии \w.... не будет соответствовать 'true'. Также ваш образец содержит пробелы вместо символов табуляции, я не знаю, является ли это форматированием на этом сайте или вашими фактическими данными.

Это будет соответствовать вашему примеру:

LotID\s+\d\s+\w+\s+(.*)\s+LotID

Хотяесли вы знаете, какие символы ожидают в идентификаторе лота, это может быть лучше выражено как

LotID[^']+(['\d\-R.]*)[^']+LotID
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...