2012-03-27 9 views
0

Ich habe eine ganz besondere Herausforderung. Ich analysiere einen Befehlszeilenstring und muss alles außer einem bestimmten Muster von Zahlen loswerden. Zum Beispiel:Python: stripping Characters von String einschließlich

str = 'abd-256PA\r\n20db' 

Ich möchte diese Nummer 20 bekommen! Wie mache ich das? Beachten Sie, dass die Nummer manchmal eine einzelne Ziffer wie 'abc-256\r\n0db' sein kann. Und die Zeichenfolge enthält nicht notwendigerweise die '\r\n' darin.

Ich habe versucht rstrip, lstrip, strip, [:] und ein paar andere Dinge ohne Erfolg.

+0

Was ist das Muster, das Sie suchen? – Abhijit

+1

Bei dieser Seite geht es nicht um spezifische * Herausforderungen *, sondern um spezifische * Fragen * ... Bitte geben Sie einen Teil des (möglicherweise nicht funktionsfähigen) Codes an, den Sie bisher geschrieben haben, damit wir Ihnen helfen können. –

+1

Verwenden Sie regulären Ausdruck (Re-Modul) – pylover

Antwort

1

wenn Ihr Ausdruck immer mit „db“ endet, versuchen:

import re 
d = "abd-256PA\r\n20db" 
s = re.search("\d{1,2}db",d) 
print d[s.start():s.end()-2] 
+0

ja ich denke, es wird immer mit db enden. das könnte funktionieren. – DavidScott612

+0

gut Ich glaube, ich dachte es nur, indem man die Teilungslinien mit() wie folgt aus: str = "abc123 \ r \ n63db" t = str.splitlines() t2 = t.rstrip ('db') – DavidScott612

+0

Ja, aber Regex ist ein normaler Weg, schneller und sicherer als die Verwendung von Splitlines() – pylover

1

du versuchen:

str.replace('\n','').replace('\r','').replace('abc-256','').replace('abd-256','').replace('PA','').replace('db','') 

Es funktioniert für die beiden Fälle, die Sie beschrieben .. Es ersetzt nur die ganze Stücke von nutzlosen Informationen mit der leeren Zeichenfolge.

aktualisiert:

Wenn Sie nicht wissen, das, was die Zeichenfolge sein wird, und Sie wissen nur, dass nach der Nummer, die Sie dort wollen ein Suffix „db“ ist, dann können Sie diesen regulären Ausdruck versuchen:

import re 
regex=re.compile("([0-9]+)db") 
str="abd-256PA\r\n20db" 
parsed_number = regex.findall(str)[0] 
print parsed_number 
+0

Denken Sie daran, dass ich nicht weiß, was die Zeichenfolge sein wird. es ist blind für mich. – DavidScott612

+0

ok, sehe meine aktualisierte meine Antwort, vielleicht ist es jetzt hilfreich. –

3

Wenn die Zahl, die Sie suchen immer am Ende der Zeichenfolge ist, können Sie es mit dieser Art von regulärem Ausdruck holen: ([0-9]+)[^0-9]*$

Beispielprogramm:

import re 
print re.search(r'([0-9]+)[^0-9]*$','abd-256PA\r\n20db').group(1) 

Beispiel Ausgabe:

20 

Testprogramm:

import re 

str = ['abd-256PA\r\n20db', 
     'abc-256\r\n0db', 
     'abc-256aa0db', 
     'uio1289248282dasd1786ddass', 
     '12', 
     '2101a123aasdqwqwe'] 

for x in str: 
    print '"%s" >> "%s"' %(x, re.search(r'([0-9]+)[^0-9]*$',x).group(1)) 

Testausgang:

"abd-256PA 
20db" >> "20" 
"abc-256 
0db" >> "0" 
"abc-256aa0db" >> "0" 
"uio1289248282dasd1786ddass" >> "1786" 
"12" >> "12" 
"2101a123aasdqwqwe" >> "123" 

Erklärung auf Anfrage:

Python hat einen regulären Ausdruck Modul re mit einer Funktion namens search, die versucht, eine gegebene Übereinstimmung des regulären Ausdrucks in der angegebenen Zeichenfolge zu finden.

Grundsätzlich ist es das, was bedeutet ([0-9]+)[^0-9]*$:

  • [0-9] beliebige Zahl von 0 bis 9
  • [0-9]+ 1 oder mehrere Vorkommen einer beliebigen Zahl von 0 bis 9
  • [^0-9] jedes Zeichen BUT Zahlen von 0 zu 9
  • [^0-9]* eine Folge von 0 oder mehr Zeichen, wo es keine Zahlen von 0 bis 9 gibt
  • $ Ende der Schnur
  • (...) Erfassung Gruppe, das Zeug versuchen wir
  • ([0-9]+)[^0-9]*$ eine Folge von 1 oder mehr Zahlen, gefolgt von 0 oder mehr Nicht-Zahlen bis zum Ende des Strings gefolgt zu finden

Die Funktion re.search benötigt 2 Parameter: einen regulären Ausdruck und eine Zeichenfolge, in der nach diesem regulären Ausdruck gesucht werden soll. Und es gibt das Objekt vom Typ MatchObject zurück. Grundsätzlich bedeutet die group(1) "Gib mir die erste erfasste Gruppe" (die in (...)).

+0

Wow, das sieht sehr kompliziert aus! – DavidScott612

+0

@ DavidScott612 Schauen Sie sich nur den Programmteil 'Beispiel' an. Der Rest ist ein Testprogramm, das verschiedene Fälle testet. Sie werden mit dem ersten 2-Zeilen-Programm gut sein. – bezmax

+0

Also, wenn ich nicht weiß, was die Zeichenfolge ist, da ich eine Befehlszeile analysiere, mache ich das zweite Argument in der re.search eine Variable? Wie print re.search (r '([0-9] +) [^ 0-9] * $', mystr) .group (1). und was ist die Funktion der Gruppe (1)? .... Entschuldigung für meine Ignoranz. – DavidScott612