Сопоставление с образцом в Python - извлечение и сохранение строк из файла - PullRequest
0 голосов
/ 20 сентября 2018

У меня есть следующий файл журнала

*** 2018-09-14T12:36:39.560671+02:00 (DB_NAME)
*** SESSION ID:(12345) 2018-09-14T12:36:39.560750+02:00
*** CLIENT ID:() 2018-09-14T12:36:39.560774+02:00
*** SERVICE NAME:(DB_NAME) 2018-09-14T12:36:39.560798+02:00
*** MODULE NAME:(mod_name_action (TNS V1-V3)) 2018-09-14T12:36:39.560822+02:00
*** ACTION NAME:() 2018-09-14T12:36:39.560848+02:00
*** CLIENT DRIVER:() 2018-09-14T12:36:39.560875+02:00
*** CONTAINER ID:(1) 2018-09-14T12:36:39.560926+02:00

Я хотел бы сохранить значение MODULE_NAME, поэтому извлеките из этой строки:

*** MODULE NAME:(mod_name_action (TNS V1-V3)) 2018-09-14T12:36:39.560822+02:00

просто так:

mod_name_action (TNS V1-V3)

Я должен сделать это с помощью Python.Я пытаюсь что-то вроде:

log_i=open(logname,"r")
    for line_of_log in log_i:
       #search the MODULE
       module = "MODULE NAME:("
       str_found_at = line_of_log.find(module)
       if str_found_at != -1: 
          regex = r"MODULE NAME:([a-zA-Z]+)"
          MODULE = re.findall(regex, line_of_log)
          print "MODULE_A==>", MODULE  

    log_i.close()

Но, конечно, это не работает.

Может ли кто-нибудь мне помочь?

Спасибо.

Ответы [ 3 ]

0 голосов
/ 20 сентября 2018

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

Мы можем использовать in для поиска строксодержащий "ИМЯ МОДУЛЯ:", а затем нам просто нужно найти первый '(' и последний ')' в этой строке, чтобы мы могли вырезать подстроку, содержащую имя.

log_i = '''\
*** 2018-09-14T12:36:39.560671+02:00 (DB_NAME)
*** SESSION ID:(12345) 2018-09-14T12:36:39.560750+02:00
*** CLIENT ID:() 2018-09-14T12:36:39.560774+02:00
*** SERVICE NAME:(DB_NAME) 2018-09-14T12:36:39.560798+02:00
*** MODULE NAME:(mod_name_action (TNS V1-V3)) 2018-09-14T12:36:39.560822+02:00
*** ACTION NAME:() 2018-09-14T12:36:39.560848+02:00
*** CLIENT DRIVER:() 2018-09-14T12:36:39.560875+02:00
*** CONTAINER ID:(1) 2018-09-14T12:36:39.560926+02:00
'''.splitlines(True)

for line_of_log in log_i:
    #search for the MODULE NAME line
    if "MODULE NAME:" in line_of_log:
        # Find the location of the first '('
        start = line_of_log.index('(')
        # Find the location of the last ')'
        end = line_of_log.rindex(')')
        modname = line_of_log[start+1:end]
        print "MODULE_A==>", modname

output

MODULE_A==> mod_name_action (TNS V1-V3)

Если в журнале есть только одна строка «MODULE NAME:» (или вы хотите напечатать только первую, если есть кратные числа), тогда вы должны поставить break после оператора print, чтобы не тратить время на проверку всех следующих строк в файле.

0 голосов
/ 20 сентября 2018

Это не работает, потому что ваш шаблон регулярного выражения неправильный: специальные символы, такие как '_' и '-', не соответствуют шаблону '[a-zA-Z] +'.Кроме того, если вы хотите избавиться от скобок, вы должны включить их в шаблон, используя escape-символ '\'.Наконец, вместо использования

 str_found_at = line_of_log.find(module)

вы можете искать непосредственно подстроку в строке в python.Наконец, я бы порекомендовал следующий код:

log_i=open(logname,"r")
for line_of_log in log_i:
   #search the MODULE
   module = "MODULE NAME:("
   if module in line_of_log:
      regex = r"MODULE NAME:\((.+)\)"
      MODULE = re.findall(regex, line_of_log)
      print "MODULE_A==>", MODULE[0]
log_i.close()
0 голосов
/ 20 сентября 2018

Использование Regex.

Демонстрация:

import re

s = """*** 2018-09-14T12:36:39.560671+02:00 (DB_NAME)
*** SESSION ID:(12345) 2018-09-14T12:36:39.560750+02:00
*** CLIENT ID:() 2018-09-14T12:36:39.560774+02:00
*** SERVICE NAME:(DB_NAME) 2018-09-14T12:36:39.560798+02:00
*** MODULE NAME:(mod_name_action (TNS V1-V3)) 2018-09-14T12:36:39.560822+02:00
*** ACTION NAME:() 2018-09-14T12:36:39.560848+02:00
*** CLIENT DRIVER:() 2018-09-14T12:36:39.560875+02:00
*** CONTAINER ID:(1) 2018-09-14T12:36:39.560926+02:00"""

res = []
for line in s.splitlines():
    m = re.search(r"(?<=MODULE NAME:\()(.*?)(?=\)\))", line)
    if m:
        res.append(m.group()+")")
print(res)

Выход:

['mod_name_action (TNS V1-V3)']
...