könnten Sie auch r'\p{M}'
verwenden, die von regex module unterstützt:
import regex
def remove_marks(text):
return regex.sub(ur"\p{M}+", "", text)
Beispiel:
>>> print s
A͋͠r͍̞̫̜t̼̭͞h́u̡̙̞̘rͬͣ̐ͮ
>>> def remove_marks(text):
... return regex.sub(ur"\p{M}+", "", text)
...
...
>>> print remove_marks(s)
Arthur
auf Ihrem Anwendungsfall Je ein Whitelist-Ansatz besser zB sein könnte, die Eingabe nur zu begrenzen, zu folgenden Zeichen:
>>> s.encode('ascii', 'ignore').decode('ascii')
u'Arthur'
Das Ergebnis hängt möglicherweise von der Unicode-Normalisierung ab, die im Text verwendet wird.
+1. Aber besser, ".startswith ('M')" anstelle von ''M' 'hier zu verwenden. Ab 6.1 gibt es keine "M" Unterkategorien für irgendwelche Kategorien, aber es gibt keine Regel, die besagt, dass es in Zukunft keine geben kann. – abarnert
@abarnert: Also sagst du, es ist besser, etwas zu verwenden, das in der Zukunft brechen könnte? – martineau
@martineau: Nein, es ist besser, etwas zu verwenden, das in der Zukunft nicht bricht. Wenn eine Unterkategorie der Kategorie "M" hinzugefügt wird, wird sie zum Kombinieren von Marken verwendet. Wenn eine neue Unterkategorie "M" einer anderen Kategorie hinzugefügt wird, wird sie nicht zum Kombinieren von Markierungen verwendet. Also, die richtige Regel für die Kombination von Marken ist 'cat.startswith ('M')', nicht '' M 'in cat'. (Es ist nicht wahrscheinlich, dass es so weit kommt, weil sie keine neuen Unterkategorien hinzugefügt haben, die Buchstaben von Hauptkategorien gemeinsam benutzten, und leerten das einzige existierende 'LC'. Aber es ist nicht schaden, das Richtige zu tun und an der geringste potentielle Vorteil.) – abarnert