Das Iterieren über Strings ist in Python leider eher langsam. Reguläre Ausdrücke sind für solche Dinge um eine Größenordnung schneller. Sie müssen nur die Charakterklasse selbst erstellen. Das Unicodedata- Modul ist hierfür sehr hilfreich, insbesondere die Funktion unicodedata.category () . Beschreibungen der Kategorien finden Sie unter Unicode-Zeichendatenbank .
import unicodedata, re, itertools, sys
all_chars = (chr(i) for i in range(sys.maxunicode))
categories = {'Cc'}
control_chars = ''.join(c for c in all_chars if unicodedata.category(c) in categories)
# or equivalently and much more efficiently
control_chars = ''.join(map(chr, itertools.chain(range(0x00,0x20), range(0x7f,0xa0))))
control_char_re = re.compile('[%s]' % re.escape(control_chars))
def remove_control_chars(s):
return control_char_re.sub('', s)
Für Python2
import unicodedata, re, sys
all_chars = (unichr(i) for i in xrange(sys.maxunicode))
categories = {'Cc'}
control_chars = ''.join(c for c in all_chars if unicodedata.category(c) in categories)
# or equivalently and much more efficiently
control_chars = ''.join(map(unichr, range(0x00,0x20) + range(0x7f,0xa0)))
control_char_re = re.compile('[%s]' % re.escape(control_chars))
def remove_control_chars(s):
return control_char_re.sub('', s)
In einigen Anwendungsfällen sind möglicherweise zusätzliche Kategorien (z. B. alle aus der Kontrollgruppe) vorzuziehen, obwohl dies die Verarbeitungszeit verlangsamen und die Speichernutzung erheblich erhöhen kann. Anzahl der Zeichen pro Kategorie:
Cc
(Kontrolle): 65
Cf
(Format): 161
Cs
(Ersatz): 2048
Co
(für den privaten Gebrauch): 137468
Cn
(nicht zugewiesen): 836601
Bearbeiten Hinzufügen von Vorschlägen aus den Kommentaren.
all_chars = (unichr(i) for i in xrange(sys.maxunicode))
diese Option , um den engen Erstellungsfehler zu vermeiden.control_chars == '\x00-\x1f\x7f-\x9f'
(getestet auf Python 3.5.2)Soweit ich weiß, wäre die pythonischste / effizienteste Methode:
quelle
Sie können versuchen, einen Filter mit der folgenden
unicodedata.category()
Funktion einzurichten :Siehe Tabelle 4-9 auf Seite 175 in den Eigenschaften der Unicode-Datenbankzeichen für die verfügbaren Kategorien
quelle
printable = {'Lu', 'Ll', Zs', 'Nd'}
In Python 3
In diesem StackOverflow-Beitrag zum Entfernen von Interpunktion erfahren Sie, wie .translate () mit Regex & .replace () verglichen wird.
Die Bereiche können
nonprintable = (ord(c) for c in (chr(i) for i in range(sys.maxunicode)) if unicodedata.category(c)=='Cc')
mithilfe der von @Ants Aasma gezeigten Unicode-Zeichendatenbankkategorien generiert werden .quelle
text.translate({c:None for c in itertools.chain(range(0x00,0x20),range(0x7f,0xa0))})
.Das Folgende funktioniert mit Unicode-Eingaben und ist ziemlich schnell ...
Meine eigenen Tests legen nahe, dass dieser Ansatz schneller ist als Funktionen, die über die Zeichenfolge iterieren und mit ein Ergebnis zurückgeben
str.join
.quelle
LINE_BREAK_CHARACTERS = set(["\n", "\r"])
undand not chr(i) in LINE_BREAK_CHARACTERS
beim Erstellen der Tabelle hinzu.Diese Funktion verwendet Listenverständnis und str.join, sodass sie in linearer Zeit anstelle von O (n ^ 2) ausgeführt wird:
quelle
filter(isprint,input)
Noch eine Option in Python 3:
quelle
r'[^' + re.escape(string.printable) + r']'
. (Ich denke nicht, dassre.escape()
es hier ganz richtig ist, aber wenn es funktioniert ...)Das Beste, was ich mir jetzt ausgedacht habe, ist (dank der Python-Izer oben)
Nur so habe ich herausgefunden, dass es mit Unicode-Zeichen / Zeichenfolgen funktioniert
Irgendwelche besseren Optionen?
quelle
Der eine unten ist schneller als der andere oben. Schau mal
quelle
"".join([c if 0x21<=ord(c) and ord(c)<=0x7e else "" for c in ss])
Es gibt bei der Verwendung der
regex
Bibliothek: https://pypi.org/project/regex/Es ist gut gepflegt und unterstützt Unicode Regex, Posix Regex und viele mehr. Die Verwendung (Methodensignaturen) ist der von Python sehr ähnlich
re
.Aus der Dokumentation:
(Ich bin nicht verbunden, nur ein Benutzer.)
quelle
Basierend auf der Antwort von @ Ber empfehle ich, nur Steuerzeichen zu entfernen, wie in den Kategorien der Unicode-Zeichendatenbank definiert :
quelle
Um 'Leerzeichen' zu entfernen,
quelle
Nach Antworten von Ants Aasma und Shawnrad :
getestet auf Python 3.7.7
quelle