408 Stimmen

Alle Sonderzeichen, Satzzeichen und Leerzeichen aus der Zeichenkette entfernen

Ich muss alle Sonderzeichen, Satzzeichen und Leerzeichen aus einer Zeichenkette entfernen, so dass ich nur Buchstaben und Zahlen habe.

555voto

user225312 Punkte 117771

Dies kann auch ohne Regex geschehen:

>>> string = "Special $#! characters   spaces 888323"
>>> ''.join(e for e in string if e.isalnum())
'Specialcharactersspaces888323'

Sie können verwenden str.isalnum :

S.isalnum() -> bool

Return True if all characters in S are alphanumeric
and there is at least one character in S, False otherwise.

Wenn Sie darauf bestehen, Regex zu verwenden, sind andere Lösungen ausreichend. Beachten Sie jedoch, dass, wenn es ohne die Verwendung eines regulären Ausdrucks möglich ist, dies der beste Weg ist, um es zu tun.

400voto

Andy White Punkte 83877

Hier ist eine Regex, die mit einer Zeichenfolge übereinstimmt, die nicht aus Buchstaben oder Zahlen besteht:

[^A-Za-z0-9]+

Hier ist der Python-Befehl für eine Regex-Ersetzung:

re.sub('[^A-Za-z0-9]+', '', mystring)

81voto

tuxErrante Punkte 1134

Kürzere Strecke:

import re
cleanString = re.sub('\W+','', string )

Wenn Sie Leerzeichen zwischen Wörtern und Zahlen wünschen, ersetzen Sie '' durch ' '

74voto

mbeacom Punkte 1328

TLDR

Ich habe die vorgegebenen Antworten zeitlich eingegrenzt.

import re
re.sub('\W+','', string)

ist typischerweise 3x schneller als die nächstschnellere Top-Antwort.

Bei der Verwendung dieser Option ist Vorsicht geboten. Einige Sonderzeichen (z. B. ø ) dürfen mit dieser Methode nicht gestreift werden.


Nachdem ich dies gesehen hatte, war ich daran interessiert, die gegebenen Antworten zu erweitern, indem ich herausfand, welche davon in der kürzesten Zeit ausgeführt werden, also ging ich durch und prüfte einige der vorgeschlagenen Antworten mit timeit gegen zwei der Beispielzeichenketten:

  • string1 = 'Special $#! characters spaces 888323'
  • string2 = 'how much for the maple syrup? $20.99? That s ridiculous!!!'

Beispiel 1

'.join(e for e in string if e.isalnum())
  • string1 - Ergebnis: 10.7061979771
  • string2 - Ergebnis: 7.78372597694

Beispiel 2

import re
re.sub('[^A-Za-z0-9]+', '', string)
  • string1 - Ergebnis: 7.10785102844
  • string2 - Ergebnis: 4.12814903259

Beispiel 3

import re
re.sub('\W+','', string)
  • string1 - Ergebnis: 3.11899876595
  • string2 - Ergebnis: 2,78014397621

Die obigen Ergebnisse sind ein Produkt aus dem niedrigsten zurückgegebenen Ergebnis und einem Durchschnitt von: repeat(3, 2000000)

Beispiel 3 kann 3x schneller sein als Beispiel 1 .

33voto

Grijesh Chauhan Punkte 54909

Python 2.*

Ich denke, gerade filter(str.isalnum, string) Werke

In [20]: filter(str.isalnum, 'string with special chars like !,#$% etcs.')
Out[20]: 'stringwithspecialcharslikeetcs'

Python 3.*

In Python3, filter( ) Funktion würde ein itertable-Objekt zurückgeben (statt eines Strings wie oben). Um eine Zeichenkette aus itertable zu erhalten, muss man eine Verbindung herstellen:

''.join(filter(str.isalnum, string)) 

oder zu passieren list bei gemeinsamer Nutzung ( nicht sicher, kann aber etwas schnell sein )

''.join([*filter(str.isalnum, string)])

Hinweis: Auspacken in [*args] gültig ab Python >= 3.5

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X