Patterns an Funktionen übergeben

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
jonsch
User
Beiträge: 2
Registriert: Montag 1. Juni 2015, 13:27

Hi Leute,
ich versuche momentan eine Funktion zu schreiben die mithilfe übergebener Patterns Infos aus log Datein ausließt.
Hier eine Methode die ich als Vorgabe nutze:

Code: Alles auswählen

import re
def simple_get_info(log_file_name, get_var_name):                 

    result = ''
    reg_line = []

    try:
        with open(log_file_name) as f:
            lines = f.readlines()
    except IOError as exception:
        return exception

    pattern = re.compile(get_var_name + r'\s+=?\s+([\d\.]+)')
    pattern_name = re.compile(r'^' + get_var_name + r'\s+=?\s+')

    for line in lines:
        if pattern_name.match(line) is not None:
            reg_line = pattern.findall(line)
            if reg_line:
                result = (reg_line[0])
    return result
Mithilfe dieser Fuktion könnte ich zum Beispiel aus einer log Datei folgendes auslesen:
x = get_info_simple("test.log","Total time:")
test.log = Total Time: 3.500
print(x) würde dann 3.500 ausgeben.

Das ganze klappt aber zum Beispiel nicht wenn ich in der Log Datei das hier stehen habe: Total Time: ------ 3.500^
Deswegen will ich das gesuchte Pattern mit an die Funktion übergeben.

Bisher sieht mein Ergebniss so aus:

Code: Alles auswählen

def simple_get_info_test(log_file_name, get_var_name , get_pattern , get_result):                 
   

    result = ''
    reg_line = []

    try:
        with open(log_file_name) as f:
            lines = f.readlines()
    except IOError as exception:
        return exception

    pattern = re.compile(get_var_name + get_pattern +get_result)
    pattern_name = re.compile(r'^' + get_var_name + get_pattern)

    for line in lines:
        if pattern_name.match(line) is not None:
            reg_line = pattern.findall(line)
            if reg_line:
                result = (reg_line[0])
    return result

x = simple_get_info_jonny("test.log","Total encoding time","r'\s+=?\s+'","r'([\d\.]+)'")
print(x)

Jedoch kriege ich hier nicht das das erwünschte Ergebniss. Ich denke es liegt daran das man den 'r' prefix operator nicht an die Funktion übergeben kann da er einfach als String behandelt wird. In der Funktion selber weiß ich nicht wie ich den operator benutzen kann wenn kein String sondern eine variable folgt....

Würde mich super über eine schnelle Antwort freuen da ich die Funktion möglichst bald brauche :K

lG Jonny
Benutzeravatar
/me
User
Beiträge: 3561
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

jonsch hat geschrieben:

Code: Alles auswählen

x = simple_get_info_jonny("test.log","Total encoding time","r'\s+=?\s+'","r'([\d\.]+)'")
Den Code an sich habe ich mir nicht angeschaut, aber du hast da ein sehr interessantes Konstrukt fabriziert.

Du hast natürlich keinen Raw-String, wenn du die Syntax für die Erstellung eines Raw-Strings wieder in einen String packst. Du musst also nicht "r'\s+=?\s+'" als Parameter verwenden sondern r'\s+=?\s+'.
jonsch
User
Beiträge: 2
Registriert: Montag 1. Juni 2015, 13:27

habe mein Problem schon selber gelöst :)
die neue Funktion sieht jetzt so aus:

Code: Alles auswählen

import re
def custom_get_info(log_file_name, get_var_name, pattern):                 
    result = None

    try:
        with open(log_file_name) as f:
            lines = f.readlines()                                 
    except IOError as exception:
        return exception
    
    get_var_name_escaped = re.escape(get_var_name)
    pattern_regexp = re.compile(get_var_name_escaped + pattern)          

    for line in lines:                                            
        if get_var_name in line:
            print("name wurde erkannt")
            reg_line = pattern_regexp.findall(line)
            if reg_line:
                result = reg_line[0]
    return result
x = custom_get_info("4562306_ffmpeg_encoder.log","x265 [info]: global :", "\s*([\d\.]+)")
print(x)
input("Press a key")
Antworten