2016-10-02 4 views
1

Ich lerne Python-String-Operationen und versuche, abgegrenzten Text in Variablen umzuwandeln.Mehrere Strings zusammenbringen

d.h. "On Tap: 20 | Bottles: 957 | Cans: 139"

Dieser String sollte Wert von 20 957 bis zuweisen Flaschen Tippen, und 139 bis Dosen. Diese Zeichenfolge ist nicht festgelegt und kann variieren (zum Beispiel 3 Werte oder 0, auch die Position von Tap, Flaschen oder Dosen kann vertauscht werden).

Bisher habe ich diese entwickelt:

import re 

strEx = "On Tap: 20 | Bottles: 957 | Cans: 139" 
barServingText = strEx.split('|') 
print(barServingText) 
for i in barServingText: 
    print (i) 
    if i.find("Bottles"): 
     print("Found Bottles") 
     Bottles = re.sub('[^0-9]*','',i) 
     print(Bottles) 
    elif i.find("Cans"): 
     print("Found Cans") 
     Cans = re.sub('[^0-9]*','',i) 
     print(Cans) 
    elif i.find("Tap"): 
     print("Found Tap") 
     Tap = re.sub('[^0-9]*','',i) 
     print(Tap) 

aber es wird nicht als pro meine Erwartungen und Neuzuweisung den Wert der Flaschen jedes Mal arbeiten.

Ausgang:

['On Tap: 20 ', ' Bottles: 957 ', ' Cans: 139'] 
On Tap: 20 
Found Bottles 
20 
Bottles: 957 
Found Bottles 
957 
Cans: 139 
Found Bottles 
139 

ich viele print Aussagen enthalten sind, die den Code debuggen. Mein Zweck ist nur, um den richtigen Variablen Werte zuzuweisen.

+0

Wenn Sie versuchen, Python zu lernen und zu versuchen, string in Variablen zu konvertieren, sollte Ihre Variable automatisch aus der Zeichenfolge erstellt werden, nicht indem Sie den Wert einer Übereinstimmung einer von Ihnen deklarierten Variablen zuweisen.exec sollte verwendet werden (was das Lernen von Python betrifft) –

+0

Kannst du ein Beispiel geben? –

+0

gucke meine Antwort, ich habe hier gepostet –

Antwort

3

find kehrt -1, wenn es nicht Zeichenfolge finden und -1 als True behandelt (bool(-1) gibt True), so haben Sie find(...) != -1

import re 

strEx = "On Tap: 20 | Bottles: 957 | Cans: 139" 
barServingText = strEx.split('|') 
print(barServingText) 
for i in barServingText: 
    print (i) 
    if i.find("Bottles") != -1: 
     print("Found Bottles") 
     Bottles = re.sub('[^0-9]*','',i) 
     print(Bottles) 
    elif i.find("Cans") != -1: 
     print("Found Cans") 
     Cans = re.sub('[^0-9]*','',i) 
     print(Cans) 
    elif i.find("Tap") != -1: 
     print("Found Tap") 
     Tap = re.sub('[^0-9]*','',i) 
     print(Tap) 

BTW verwenden: mit Ihren Daten, die Sie nicht tun brauche re. Sie können split (und strip) verwenden

Bottles = i.split(':')[1].strip() 

Cans = i.split(':')[1].strip() 

Tap = i.split(':')[1].strip() 
1

Die str.find() Methode zur Rückführung der Position des Textes in einem String verwendet wird. Wenn der Text nicht gefunden wird, wird die Ganzzahl -1 zurückgegeben. In Python, zu überprüfen, ob auf Zeichenfolge enthält eine andere, können Sie die Syntax if subString in string:, wie so verwenden möchten:

... 
    if "Bottles" in i: 
     print("Found Bottles") 
... 

Als offizieller Dokumentation heißt es:

Für die Zeichenfolge und Byte-Typen, x in y ist nur dann wahr, wenn x eine Teilzeichenfolge von y ist. Ein äquivalenter Test ist y.find(x) != -1

Also, je nach Ihrer bevorzugten Art der Programmierung und/oder die individuellen Bedürfnisse, können Sie wählen zwischen „x in y“ oder „y.find(x) != -1

1

Die folgende regex sollte für Sie Schlüsselwertpaar erstellen :

r"((.*?):(.*?)(\||$))" 

Der folgende Ansatz besser geeignet, ich denke jedoch, wie es sie dynamisch machen würde und mehr als diese drei Variablen

haben
import re 

regex = ur"((.*?):(.*?)(\||$))" 

test_str = u"On Tap: 20 | Bottles: 957 | Cans: 139" 

matches = re.finditer(regex, test_str) 

for matchNum, match in enumerate(matches): 
    s=match.group(2).strip().split(' ')[-1]+"="+match.group(3).strip() 
    print(s) 
    exec(s) 

print(Tap) 
print(Bottles) 
print(Cans) 
+0

Ich habe das Gefühl, dass das etwas komplett umschreibt OPs Code, während er nur versuchte herauszufinden, warum sein Code nicht wie erwartet funktionierte. –

+0

@Ben Morris die Aussage sagt: "Diese Zeichenfolge ist nicht festgelegt und kann variieren (zum Beispiel 3 Werte oder 0 Wert auch die Position von Wasserhahn, Flaschen oder Dosen können ausgetauscht werden)." wäre das ein guter Fall, um etwas mit hardcoded Ansatz zu iterieren? exec ("% s =% d"% (x, 2)) kann verwendet werden, um den Wert der Gruppe 3 der Gruppe 2 zuzuweisen, wobei einige Stripping- und Casting-Funktionen dynamisch ausgeführt werden. Meine Absicht ist es, einen besseren Ansatz vorzuschlagen ... daher denke ich, dass der Ansatz nicht richtig ist –

Verwandte Themen