2016-05-16 4 views
2

Ich benutze Python, um eine Text-Log-Datei Zeile für Zeile zu durchsuchen und ich möchte einen bestimmten Teil einer Zeile als Variable speichern. Ich benutze Regex, aber glaube nicht, dass ich es richtig verwende, da ich immer None für meine Variable string_I_want bekomme. Ich habe mir hier andere Regex-Fragen angesehen und gesehen, wie Leute .group() an das Ende ihrer re.search angefügt haben, aber das gibt mir einen Fehler. Ich bin mit Regex nicht vertraut, kann aber nicht herausfinden, wo ich falsch liege?Python: Get spezifischen Text in einer Zeile einer Datei mit Regex

Beispielprotokolldatei:

2016-03-08 11:23:25 test_data:0317: m=string_I_want max_count: 17655, avg_size: 320, avg_rate: 165 

Mein Skript:

def get_data(log_file): 

    #Read file line by line 
    with open(log_file) as f: 
     f = f.readlines() 

     for line in f: 
      date = line[0:10] 
      time = line[11:19] 

      string_I_want=re.search(r'/m=\w*/g',line) 

      print date, time, string_I_want 
+0

regex ist wrong..you verwenden Javascript-Format von regex – rock321987

+1

Erraten Sie nicht nur, was diese 're' Funktionen und Methoden tun --- lesen Sie die "[Regular Expression HOWTO] (https://docs.python.org/2/howto/regex.html)" für eine gründliche Einführung in die Verwendung von regulären Ausdrücken in Python 2, und verweisen Sie auf die ['re 'Referenzdokumente] (https://docs.python.org/2/library/re.html), wenn Sie nach Details suchen müssen. Es wird Ihnen auf lange Sicht Zeit sparen. –

Antwort

2

Sie müssen die /.../ Trennzeichen mit dem globalen Flag zu entfernen, und eine Erfassungsgruppe verwenden:

mObj = re.search(r'm=(\w+)',line) 
if mObj: 
    string_I_want = mObj.group(1) 

Siehe hierzu regex demo und Python demo:

import re 
p = r'm=(\w+)'    # Init the regex with a raw string literal (so, no need to use \\w, just \w is enough) 
s = "2016-03-08 11:23:25 test_data:0317: m=string_I_want max_count: 17655, avg_size: 320, avg_rate: 165" 
mObj = re.search(p, s)  # Execute a regex-based search 
if mObj:     # Check if we got a match 
    print(mObj.group(1)) # DEMO: Print the Group 1 value 

Muster Details:

  • m= - passend m= wörtliche Zeichenfolge (fügen Sie ein Leerzeichen vor oder \b wenn ein ganzes Wort angepasst werden muss)
  • (\w+) - Gruppe 1 Capturing 1+ alphanumerische Zeichen oder Unterstriche. Wir können diesen Wert mit der Methode .group(1) referenzieren.
0

Do:

(?<=\sm=)\S+ 

Beispiel:

In [135]: s = '2016-03-08 11:23:25 test_data:0317: m=string_I_want max_count: 17655, avg_size: 320, avg_rate: 165' 

In [136]: re.search(r'(?<=\sm=)\S+', s).group() 
Out[136]: 'string_I_want' 
0

Hier ist, was Sie brauchen:

import re 
def get_data(logfile): 
    f = open(logfile,"r") 
    for line in f.readlines(): 
     s_i_w = re.search(r'(?<=\sm=)\S+', line).group() 
     if s_i_w: 
      print s_i_w 
    f.close() 
Verwandte Themen