2016-04-05 17 views
0

ich zahlreiche Werte aus einem ziemlich komplexen String zu erhalten bin versucht, die wie folgt aussieht -Python - Schleife durch Werte in einem String

s = '04/03 23:50:06:242[76:Health]: (mem=188094936/17146904576) Queue Size[=:+:-] : Core[Compiler:0:0:0,HighPriority:0:74:74,Default:6:1872:1874,LowPriority:0:2:2]:Special[Special:0:2:2]:Event[Event:0:0:0]:Comm[CommHigh:0:1134:1152,CommDefault:0:4:4]' 

Dies sind die Werte, die ich brauche zu scannen -

list = ['Compiler', 'HighPriority', 'Default', 'LowPriority', 'Special', 'Event', 'CommHigh', 'CommDefault'] 

Meine Absicht ist es, die 3 Zahlen nach jeder Zeichenfolge so im Beispiel HighPriority Ich würde [0, 74, 74] bekommen, die ich dann etwas mit jedem Element tun kann.

Ich habe das unten verwendet, aber es berücksichtigt nicht, wenn das Ende der Zeichenfolge kein Komma ist.

def find_between(s, first, last): 
    try: 
     start = s.index(first) + len(first) 
     end = s.index(last, start) 
     return s[start:end] 
    except ValueError: 
     return "" 


for l in list: 
    print l 
    print find_between(s, l + ':', ',').split(':') 
+0

Ich denke, die beste Methode, dieses Problem zu lösen, zu lernen, ist zu verwenden Modul „re“ des Standard-lib. – mkiever

+0

Ja, mein Re-Fu ist schrecklich. Ich habe versucht, re zu verwenden, aber wenn ich einen Block von Code sehe wie '\ d \ w \ ++ \? \ (\)' Ich friere ein, weil es einfach nicht für mich ist zu lesen :( – whoisearth

+0

Etwas wie 'r = re .search ('Compiler: ([0-9] +): ([0-9] +): ([0-9] +)', s) 'sollten Sie beginnen. Verwenden Sie' r.groups() ' um die drei Teilstrings zu erhalten, die die Zahlen enthalten – mkiever

Antwort

2

bearbeiten, wenn Sie wirklich Regexes vermeiden wollen, Ihr Ansatz mit einer kleinen zwicken arbeitet (I list-l umbenannt zu vermeiden, die eingebauten Typ Shadowing):

from itertools import takewhile 
from string import digits 

def find_between(s, first): 
    try: 
     start = s.index(first) + len(first) 
     # Keep taking the next character while it's either a ':' or a digit 
     # You can also just cast this into a list and forget about joining and later splitting. 
     # Also, consider storing ':'+digits in a variable to avoid recreating it all the time 
     return ''.join(takewhile(lambda char: char in ':'+digits, s[start:])) 
    except ValueError: 
     return "" 


for _ in l: 
    print _ 
    print find_between(s, _ + ':').split(':') 

Diese Drucke:

Compiler 
['0', '0', '0'] 
HighPriority 
['0', '74', '74'] 
Default 
['6', '1872', '1874'] 
LowPriority 
['0', '2', '2'] 
Special 
['0', '2', '2'] 
Event 
['0', '0', '0'] 
CommHigh 
['0', '1134', '1152'] 
CommDefault 
['0', '4', '4'] 

Dies ist jedoch eine Aufgabe für Regex, und Sie sollten versuchen, die Grundlagen kennen zu lernen.

import re 

def find_between(s, word): 
    # Search for your (word followed by ((:a_digit) repeated three times)) 
    x = re.search("(%s(:\d+){3})" % word, s) 
    return x.groups()[0] 

for word in l: 
    print find_between(s, word).split(':', 1)[-1].split(':') 

Dieser druckt

['0', '0', '0'] 
['0', '74', '74'] 
['6', '1872', '1874'] 
['0', '2', '2'] 
['0', '2', '2'] 
['0', '0', '0'] 
['0', '1134', '1152'] 
['0', '4', '4'] 
0

Dies wird Ihnen alle Gruppen erhalten, vorausgesetzt, wird der String immer gut gebildet:

re.findall('(\w+):(\d+):(\d+):(\d+)', s) 

Es wird auch die Zeit, die Sie aus der Liste leicht entfernen können.

Oder Sie können ein Wörterbuch Verständnis, um die Elemente zu organisieren:

matches = re.findall('(\w+):(\d+:\d+:\d+)', s) 
my_dict = {k : v.split(':') for k, v in matches[1:]} 

I matches[1:] hier verwendet der falschen Spiel loszuwerden. Sie können das tun, wenn Sie wissen, dass es immer da sein wird.

0

Check this:

import re 
s = '04/03 23:50:06:242[76:Health]: (mem=188094936/17146904576) Queue Size[=:+:-] : Core[Compiler:0:0:0,HighPriority:0:74:74,Default:6:1872:1874,LowPriority:0:2:2]:Special[Special:0:2:2]:Event[Event:0:0:0]:Comm[CommHigh:0:1134:1152,CommDefault:0:4:4]' 
search = ['Compiler', 'HighPriority', 'Default', 'LowPriority', 'Special', 'Event', 'CommHigh', 'CommDefault'] 
data = [] 
for x in search: 
    data.append(re.findall(x+':([0-9]+:[0-9]+:[0-9]+)', s)) 

data = [map(lambda x: x.split(':'), x) for x in data] # remove : 
data = [x[0] for x in data] # remove unnecessary [] 
data = [map(int,x) for x in data] # convert to int 
print data 

>>>[[0, 0, 0], [0, 74, 74], [6, 1872, 1874], [0, 2, 2], [0, 2, 2], [0, 0, 0], [0, 1134, 1152], [0, 4, 4]] 
Verwandte Themen