2017-11-10 10 views
2

Entschuldigung im Voraus, wenn dies ein PEBKAC Problem wird, aber ich kann nicht sehen, was ich falsch mache.Text stripping Ausgabe

Python 3.5.1 (FWIW)

I Daten von einer Online-Quelle gezogen haben, wobei jede Zeile der Seite ist .strip() ‚ED \ n \ r usw. und in ein UTF -8 Zeichenfolge. Die gesuchten Zeilen werden weiter unten reduziert.

Ich möchte zwei Zeichenfolgen nehmen, sie verbinden und alle nicht-alphanumerischen Zeichen entfernen.

> x = "ABC" 
> y = "Some-text as an example." 
> z = x+y.lower() 

> type z 
<class 'str'> 

Also hier ist das Problem.

> z = z.strip("'-. ") 
> print z 

Warum ist das Ergebnis:

ABCsome-text as an example.

und nicht, wie ich möchte:

ABCsometextasanexample

ich kann es mit vier .replace zu arbeiten() Befehle, aber Streifen will hier wirklich nicht arbeiten.

> y = y.strip("-") 
> print(y) 
some-text as an example. 

Während

> y.replace("-", '') 
> print(y) 
sometext as an example. 

Irgendwelche Gedanken auf, was könnte ich mit .strip() falsch machen werden: Ich habe auch separate geteilte Befehle versucht?

+4

Streifen Entfernt nur den Anfang und das Ende der Zeichenfolge und entfernt eine Sequenz, nicht alle aufgelisteten Zeichen. –

+0

PEBKAC Bedeutung was? –

+0

@PeterWood: PEBKAC == "Problem existiert zwischen Tastatur und Stuhl" (zB: menschlicher Fehler) –

Antwort

2

Da Sie wollen alle nicht-alphanumerischen Zeichen zu entfernen, lässt es mehr Generika mit:

import re 

x = "ABC" 
y = "Some-text as an example." 
z = x+y.lower() 

z = re.sub(r'\W+', '', z) 
+0

Und das ist die elegante Lösung, nach der ich gesucht habe, statt einer Sequenz von Ersetzungsbefehlen. Vielen Dank! –

1

Der Streifen entfernt nicht alle Zeichen, er entfernt nur Zeichen von den Enden der Zeichenfolgen.

Von the official documentation

Return eine Kopie des Strings mit den vorderen und hinteren entfernten Zeichen. Das chars-Argument ist eine Zeichenfolge, die die Menge der zu entfernenden Zeichen angibt. Wenn sie weggelassen oder None ist, wird das chars-Argument standardmäßig zum Entfernen von Leerzeichen verwendet. Das Zeichen Argument ist kein Präfix oder Suffix; vielmehr sind alle Kombinationen der Werte

gestrippt
+0

Ja, das ist die Trennung, die ich hatte, dass es nicht überall gilt, sondern nur an den Enden. Vielen Dank! –

0

Wie andere haben darauf hingewiesen, ist das Problem mit strip(), dass es nur am Anfang und am Ende der Saiten usw. Zeichen arbeitet replace() mehrfach unter Verwendung wäre der Weg zu erreichen Sie, was Sie wollen, nur mit String-Methoden.

Obwohl nicht die Frage, die Sie gestellt haben, ist hier, wie Sie es mit einem Aufruf zu tun mit der re.sub() Funktion in der re Regular-Expression-Modul. Die zu ersetzenden willkürlichen Zeichen werden durch den Inhalt des Namens der Zeichenfolgenvariablen chars definiert.

import re 

x = "ABC" 
y = "Some-text as an example." 
z = x + y.lower() 

print('before: {!r}'.format(z)) # -> before: 'ABCsome-text as an example.' 

chars = "'-. " # Characters to be replaced. 
z = re.sub('(' + '|'.join(re.escape(ch) for ch in chars) + ')', '', z) 

print('after: {!r}'.format(z)) # -> after: 'ABCsometextasanexample' 
0

Eine andere Lösung wäre Python-Filter verwenden():

import re 

x = "ABC" 
y = "Some-text as an example." 
z = x+y.lower() 

z = filter(lambda c: c.isalnum(), z)