Auf meiner Website können Leute Nachrichten veröffentlichen, und einige Redakteure benutzen MS Word und ähnliche Tools, um den Text zu schreiben und dann kopieren und in den Editor meiner Website einfügen (einfache Textarea, kein WYSIWYG usw.).
Diese Texte enthalten normalerweise "nette" Anführungszeichen anstelle der einfachen ASCII-Anführungszeichen ( "
). Sie enthalten manchmal auch längere Bindestriche wie –
anstelle von -
.
Nun möchte ich alle diese Zeichen durch ihre ASCII-Gegenstücke ersetzen. Ich möchte jedoch keine Umlaute und andere nicht-ASCII-Zeichen entfernen. Ich würde auch sehr gerne eine geeignete Lösung verwenden, die kein Mapping-Diktat für all diese Zeichen erstellt.
Alle meine Strings sind Unicode-Objekte.
Sie können die Methode str.translate () verwenden ( Ссылка ). Lesen Sie jedoch das Dokument zu Unicode - die Übersetzungstabelle hat eine andere Form: Unicode Ordnungszahl - & gt; Unicode-String (normalerweise char) oder None.
Nun, aber es erfordert das Diktat. Sie müssen die Ersetzungen trotzdem erfassen. Wie möchten Sie das ohne Tabellen oder Arrays tun? Sie könnten str.replace () für die einzelnen Zeichen verwenden, aber das wäre ineffizient.
Was ist damit? Es erstellt zuerst Übersetzungstabelle, aber ehrlich gesagt glaube ich nicht, dass Sie das ohne es tun können.
%Vor% Ich konnte diesen Druck nicht auf einer Konsole (unter Windows) ausführen, daher musste ich in die txt-Datei schreiben.
Die Ausgabe in der a.txt-Datei sieht folgendermaßen aus:
a_str="lustige single quotes" lange und kurze Striche 'nette Single Zitate '"schöne doppelte Anführungszeichen" fixed_str =' lustige einfache Anführungszeichen ' lang - und - kurze Striche "schöne einfache Anführungszeichen" "schöne doppelte Anführungszeichen"
Übrigens funktioniert der obige Code in Python 3. Wenn Sie ihn für Python 2 benötigen, müssen möglicherweise einige Korrekturen vorgenommen werden, da die Unicode-Zeichenfolgen in beiden Versionen der Sprache anders gehandhabt werden.
Sie können auf dem Unidecode -Paket aufbauen.
Das ist ziemlich langsam, da wir zuerst den Unicode in der kombinierten Form normalisieren und dann versuchen herauszufinden, woraus der Unidecode besteht. Wenn wir einen lateinischen Buchstaben verwenden, verwenden wir tatsächlich das ursprüngliche NFC-Zeichen. Wenn nicht, dann liefern wir den Entschlüsselungscode, den Unidecode vorgeschlagen hat. Dies lässt akzentuierte Buchstaben allein, aber wird alles andere konvertieren.
%Vor%Es gibt keine solche "richtige" Lösung, weil für jedes gegebene Unicode-Zeichen kein "ASCII-Gegenstück" definiert ist.
Nehmen Sie beispielsweise die scheinbar einfachen Zeichen, die Sie ASCII-Anführungszeichen und doppelten Anführungszeichen und Bindestrichen zuordnen möchten. Lassen Sie zunächst alle Unicode-Zeichen mit ihren offiziellen Namen generieren. Zweitens, lassen Sie alle Anführungszeichen, Bindestriche und Bindestriche nach den Namen suchen:
%Vor%Wie Sie sehen können, gibt es viele Probleme, so einfach dieses Beispiel ist. Es gibt viele Anführungszeichen in Unicode, die nicht so aussehen wie die Anführungszeichen in US-ASCII, und in Unicode gibt es viele Bindestriche, die in US-ASCII nicht wie das Bindestrich-Minus-Zeichen aussehen.
Und es gibt viele Fragen. Zum Beispiel:
Um ein "korrektes" ASCII-Gegenstück zu erstellen, muss jemand diese Fragen basierend auf dem Verwendungskontext beantworten. Aus diesem Grund basieren alle Lösungen für Ihr Problem auf der einen oder anderen Weise auf einem Mapping-Wörterbuch. Und all diese Lösungen werden zu unterschiedlichen Ergebnissen führen.
Dieses Werkzeug normalisiert die Interpunktion im Markdown: Ссылка
-S, --smart Produziert typografisch korrekte Ausgabe, konvertiert gerade Zitate in geschweifte Anführungszeichen, --- in em-Bindestriche, - in Bindestriche, und ... zu Ellipsen. Nichtbrechende Leerzeichen werden nach bestimmten Kriterien eingefügt Abkürzungen wie "Mr." (Hinweis: Diese Option ist nur wichtig wenn das Eingabeformat Markdown oder Textil ist. Es ist ausgewählt automatisch, wenn das Eingabeformat Textil oder das Ausgabeformat ist Latex oder Kontext.)
Es ist Haskell, also müssen Sie die Schnittstelle herausfinden.