Ich muss alle Nicht-ASCII-Zeichen (\ x00- \ x7F) durch ein Leerzeichen ersetzen. Ich bin überrascht, dass dies in Python nicht ganz einfach ist, es sei denn, ich vermisse etwas. Die folgende Funktion entfernt einfach alle Nicht-ASCII-Zeichen:
def remove_non_ascii_1(text):
return ''.join(i for i in text if ord(i)<128)
Und dieses ersetzt Nicht-ASCII-Zeichen durch die Anzahl der Leerzeichen gemäß der Anzahl der Bytes im Zeichencodepunkt (dh das –
Zeichen wird durch 3 Leerzeichen ersetzt):
def remove_non_ascii_2(text):
return re.sub(r'[^\x00-\x7F]',' ', text)
Wie kann ich alle Nicht-ASCII-Zeichen durch ein Leerzeichen ersetzen?
Von der Vielzahl von ähnlichen SO Fragen , keine Adresse Zeichen Ersatz als Gegensatz zum Strippen , und zusätzlich alle Nicht-ASCII - Zeichen - Adresse eines bestimmtes Zeichen.
–
. Es ist dieser Typ .Antworten:
Ihr
''.join()
Ausdruck filtert und entfernt alles, was nicht ASCII ist. Sie können stattdessen einen bedingten Ausdruck verwenden:Dies behandelt Zeichen nacheinander und würde immer noch ein Leerzeichen pro ersetztem Zeichen verwenden.
Ihr regulärer Ausdruck sollte nur aufeinanderfolgende Nicht-ASCII-Zeichen durch ein Leerzeichen ersetzen :
Beachten Sie das
+
dort.quelle
str.join()
benötigt eine Liste (die Werte werden zweimal übergeben), und ein Generatorausdruck wird zuerst in einen konvertiert. Ein Listenverständnis zu vermitteln ist einfach schneller. Siehe diesen Beitrag .–
Zeichen wird durch 3 Leerzeichen ersetzt" in der Frage impliziert, dass die Eingabe ein Bytestring (nicht Unicode) ist und daher Python 2 verwendet wird (andernfalls''.join
würde dies fehlschlagen). Wenn OP ein einzelnes Leerzeichen pro Unicode-Codepunkt möchte, sollte die Eingabe zuerst in Unicode dekodiert werden.Für Sie, um die ähnlichste Darstellung Ihrer ursprünglichen Zeichenfolge zu erhalten, empfehle ich das Unidecode-Modul :
Dann können Sie es in einer Zeichenfolge verwenden:
quelle
דותן
. Im Allgemeinen ist dies jedoch großartig, danke!Verwenden Sie für die Zeichenverarbeitung Unicode-Zeichenfolgen:
Beachten Sie jedoch, dass Sie immer noch ein Problem haben, wenn Ihre Zeichenfolge zerlegte Unicode-Zeichen enthält (z. B. separates Zeichen und kombinierte Akzentzeichen):
quelle
ud.normalize('NFC',s)
, Markierungen zu kombinieren, aber nicht alle Kombinationskombinationen werden durch einzelne Codepunkte dargestellt. Sie würden eine intelligentere Lösung benötigen, umud.category()
den Charakter zu betrachten.\X
(eXtended Grapheme Cluster) Regex (vomregex
Modul unterstützt) ermöglicht das Durchlaufen solcher Zeichen (Hinweis: "Grapheme kombinieren nicht unbedingt Zeichenfolgen, und das Kombinieren von Zeichenfolgen ist nicht unbedingt ein Graphem" ).Wenn das Ersatzzeichen '?' Anstelle eines Leerzeichens würde ich vorschlagen
result = text.encode('ascii', 'replace').decode()
:Ergebnisse:
quelle
Was ist mit diesem?
quelle
Als nativer und effizienter Ansatz müssen Sie keine
ord
Zeichen oder Schleifen verwenden. Codieren Sie einfach mitascii
und ignorieren Sie die Fehler.Im Folgenden werden nur die Nicht-ASCII-Zeichen entfernt:
Wenn Sie nun die gelöschten Zeichen ersetzen möchten, gehen Sie wie folgt vor:
quelle
encode
einen Bytestring zurück. Denken Sie also daran. Außerdem werden bei dieser Methode keine Zeichen wie Zeilenumbrüche entfernt.Möglicherweise für eine andere Frage, aber ich biete meine Version der Antwort von @ Alvero an (unter Verwendung von Unidecode). Ich möchte einen "regulären" Streifen für meine Zeichenfolgen erstellen, dh den Anfang und das Ende meiner Zeichenfolge für Leerzeichen, und dann nur andere Leerzeichen durch ein "reguläres" Leerzeichen ersetzen, d. H.
zu
,
Wir ersetzen zuerst alle Nicht-Unicode-Leerzeichen durch ein reguläres Leerzeichen (und verbinden es wieder).
Und dann teilen wir das noch einmal mit Pythons normalem Split und entfernen jedes "Bit".
Und zuletzt verbinden Sie diese wieder, aber nur, wenn die Zeichenfolge einen
if
Test besteht,Und damit
safely_stripped('ㅤㅤㅤㅤCeñíaㅤmañanaㅤㅤㅤㅤ')
richtig zurück'Ceñía mañana'
.quelle