2017-04-19 1 views
1

Ich versuche, ein Protokoll mit der Parse-Bibliothek von Python zu analysieren. (https://pypi.python.org/pypi/parse) Für meine Zwecke muss ich die Typbezeichner in der Formatzeichenfolge verwenden, jedoch können einige der Daten, die ich analysiere, eine Kombination mehrerer dieser Typen sein.Verwenden von Python Parse, um eine Zeichenfolge aus Zahlen, Buchstaben, Leerzeichen und Symbolen zu erhalten

Zum Beispiel:

"4.56|test-1 Cool|dog" 

I die Nummer der vorderen analysieren kann das Format-Spezifizierer g (allgemeine Zahl) und W (Wort) für "dog" am Ende verwendet wird. Der mittlere Ausdruck "test-1 Cool" ist jedoch eine Zahl, Buchstaben, Leerraum und ein Strich. Die Verwendung eines der Spezifizierer alleine scheint nicht zu funktionieren (habe W, w, s und S versucht). Ich möchte diesen Ausdruck als String extrahieren.

Ohne das Problem Phrase, würde ich dies nur tun:

test = "|4.56|dog|" 
result = parse('|{number:g}|{word:w}|', test) 

EDIT: Ich habe einen gewissen Erfolg hatte unten einen benutzerdefinierten Typ Umwandlung gezeigt mit:

def SString(string): 
    return string 

test = "|4.56|test-1 Cool|dog|" 
result = parse('|{number:g}|{other:SString}|{word:w}|', test, dict(SString=SString)) 

Antwort

2

Sie können das mit einem Code wie diesem tun:

from parse import * 

test = "4.56|test-1 Cool|dog" 
result = parse('{number:g}|{other}|{word:w}', test) 
print result 
#<Result() {'other': 'test-1 Cool', 'word': 'dog', 'number': 4.56}> 

Auch für Typ Prüfen Sie re Modul (zum Beispiel) verwenden können:

from parse import * 
import re 

def SString(string): 
    if re.match('\w+-\d+ \w+',string): 
     return string 
    else: 
     return None 

test = "|4.56|test-1 Cool|dog|" 
result = parse('|{number:g}|{other:SString}|{word:w}|', test, dict(SString=SString)) 
print(result) 
#<Result() {'other': 'test-1 Cool', 'word': 'dog', 'number': 4.56}> 

test = "|4.56|t3est Cool|dog|" 
result = parse('|{number:g}|{other:SString}|{word:w}|', test, dict(SString=SString)) 
print(result) 
#<Result() {'other': None, 'word': 'dog', 'number': 4.56}> 
+0

Das wäre großartig, aber ich brauche wirklich den Typspezifizierer um den vom Benutzer gewünschten Typ zu bestimmen, da die Analysezeichenfolge von einem Benutzer eingegeben wird. Ich verwende derzeit eine benutzerdefinierte Typumwandlung und es scheint zu funktionieren, ok, ich werde es zu meinem ursprünglichen Beitrag hinzufügen –

+0

@SethDavis überprüfen Sie meine Antwort jetzt – RaminNietzsche

+0

Vielen Dank! Es sieht zwar so aus, als ob die re.match-Zeile dieses spezifische Format erwartet, obwohl es in Wirklichkeit mehrere verschiedene Formate geben könnte, die Leerzeichen oder Zahlen enthalten oder nicht enthalten. "test 1-cool" "cool1-test" "cool-test" sollte alles gleich funktionieren und nur das als String zurückgeben. Ich möchte einfach das Ganze als String, mit einem Typspezifizierer, der mir sagt, dass ich eine Zeichenfolge erwarten soll. Ich glaube, die benutzerdefinierte Typumwandlung funktioniert gut dafür, aber es ist großartig, in die re-Bibliothek eingeführt zu werden –

1

Wie wäre es

versuchen
test.split("|") 
+0

Die Zeichenfolge für Parse bequemer ist, wie es ist einfach, in einer Konfigurationsdatei und bearbeiten haben, auch die Typdeklarierer sind nützlich, da die Daten an eine Datenbank gesendet werden, was bedeutet, ich muss wissen, welcher Typ jedes Stück sein sollte, so dass der Datentyp und der Typ der Spalte übereinstimmen –

Verwandte Themen