it-swarm.com.de

Entfernen Sie alle Sonderzeichen, Satzzeichen und Leerzeichen aus der Zeichenfolge

Ich muss alle Sonderzeichen, Satzzeichen und Leerzeichen aus einer Zeichenfolge entfernen, damit ich nur Buchstaben und Zahlen habe.

185
user664546

Dies kann ohne regex erfolgen:

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

Sie können 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 auf der Verwendung von regex bestehen, reichen andere Lösungen aus. Beachten Sie jedoch, dass dies der beste Weg ist, wenn Sie keinen regulären Ausdruck verwenden müssen.

294
user225312

Hier ist ein regulärer Ausdruck, der mit einer Zeichenfolge übereinstimmt, die keine Buchstaben oder Zahlen sind:

[^A-Za-z0-9]+

Hier ist der Python Befehl, um eine Regex-Ersetzung durchzuführen:

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

Kurzer Weg:

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

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

39
bastaPasta

Nachdem ich dies gesehen hatte, war ich daran interessiert, die bereitgestellten Antworten zu erweitern, indem ich herausfand, welche in der kürzesten Zeit ausgeführt werden kann, und ging einige der vorgeschlagenen Antworten mit timeit durch gegen zwei der Beispielzeichenfolgen:

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

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 des niedrigsten zurückgegebenen Ergebnisses aus einem Durchschnitt von: repeat(3, 2000000)

Beispiel 3 kann 3x schneller sein als Beispiel 1 .

25
mbeacom

Python 2. *

Ich denke nur filter(str.isalnum, string) funktioniert

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

Python 3. *

In Python3 würde die Funktion filter( ) ein itertable-Objekt zurückgeben (anstelle der oben beschriebenen Zeichenfolge). Man muss sich zurückmelden, um einen String aus der itertable zu erhalten:

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

oder list in join übergeben ( nicht sicher, kann aber schnell sein )

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

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

19
Grijesh Chauhan
#!/usr/bin/python
import re

strs = "how much for the maple syrup? $20.99? That's ricidulous!!!"
print strs
nstr = re.sub(r'[?|$|.|!]',r'',strs)
print nstr
nestr = re.sub(r'[^a-zA-Z0-9 ]',r'',nstr)
print nestr

sie können weitere Sonderzeichen hinzufügen, die durch "" ersetzt werden. Dies bedeutet, dass keine Sonderzeichen entfernt werden.

15
pkm

Anders als alle anderen, die Regex verwenden, würde ich versuchen, jedes Zeichen auszuschließen, das nicht das ist, was ich will, anstatt explizit aufzuzählen, was ich nicht will.

Wenn ich zum Beispiel nur Zeichen von 'a bis z' (Groß- und Kleinschreibung) und Zahlen möchte, würde ich alles andere ausschließen:

import re
s = re.sub(r"[^a-zA-Z0-9]","",s)

Dies bedeutet "Ersetzen Sie jedes Zeichen, das keine Zahl ist, oder ein Zeichen im Bereich 'a bis z' oder 'A bis Z' durch eine leere Zeichenfolge".

In der Tat, wenn Sie das Sonderzeichen ^ An der ersten Stelle Ihres regulären Ausdrucks einfügen, erhalten Sie die Negation.

Zusätzlicher Tipp: Wenn Sie auch Kleinbuchstaben das Ergebnis benötigen, können Sie den regulären Ausdruck noch schneller und einfacher machen, solange Sie jetzt keine Großbuchstaben finden.

import re
s = re.sub(r"[^a-z0-9]","",s.lower())
11
Andrea

Angenommen, Sie möchten einen regulären Ausdruck verwenden und möchten/benötigen Unicode-erkennenden 2.x-Code, der 2to3-fähig ist:

>>> import re
>>> rx = re.compile(u'[\W_]+', re.UNICODE)
>>> data = u''.join(unichr(i) for i in range(256))
>>> rx.sub(u'', data)
u'0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz\xaa\xb2 [snip] \xfe\xff'
>>>
7
John Machin
s = re.sub(r"[-()\"#/@;:<>{}`+=~|.!?,]", "", s)
5
sneha

Der allgemeinste Ansatz ist die Verwendung der "Kategorien" der Unicode-Datentabelle, die jedes einzelne Zeichen klassifiziert. Z.B. Der folgende Code filtert nur druckbare Zeichen basierend auf ihrer Kategorie:

import unicodedata
# strip of crap characters (based on the Unicode database
# categorization:
# http://www.sql-und-xml.de/unicode-database/#kategorien

PRINTABLE = set(('Lu', 'Ll', 'Nd', 'Zs'))

def filter_non_printable(s):
    result = []
    ws_last = False
    for c in s:
        c = unicodedata.category(c) in PRINTABLE and c or u'#'
        result.append(c)
    return u''.join(result).replace(u'#', u' ')

Schauen Sie sich die oben angegebene URL für alle verwandten Kategorien an. Sie können natürlich auch nach Interpunktionskategorien filtern.

5
Andreas Jung

Einen Übersetzer benutzen:

import string

def clean(instr):
    return instr.translate(None, string.punctuation + ' ')

Vorsichtsmaßnahme: Funktioniert nur mit Ascii-Saiten.

3
jjmurre
import re
abc = "askhnl#$%askdjalsdk"
ddd = abc.replace("#$%","")
print (ddd)

und du sollst dein Ergebnis sehen als

'askhnlaskdjalsdk

1
Dsw Wds
import re
my_string = """Strings are amongst the most popular data types in Python. We can create the strings by enclosing characters in quotes. Python treats single quotes the 

dasselbe wie doppelte Anführungszeichen. "" "

# if we need to count the Word python that ends with or without ',' or '.' at end

count = 0
for i in text:
    if i.endswith("."):
        text[count] = re.sub("^([a-z]+)(.)?$", r"\1", i)
    count += 1
print("The count of Python : ", text.count("python"))
0