In Python, wie man alle Zeichen auflistet, die durch POSIX ausgedehnte regex `[: space:]` abgestimmt sind?

In Python, wie man alle Zeichen auflistet, die durch POSIX ausgedehnte regex [:space:] abgestimmt sind?

Gibt es eine programmatische Möglichkeit, die Unicode-Codepunkte zu extrahieren, die von [:space:] abgedeckt sind?

3 Solutions collect form web for “In Python, wie man alle Zeichen auflistet, die durch POSIX ausgedehnte regex `[: space:]` abgestimmt sind?”

Verwenden eines Generators anstelle eines Listenverständnisses und xrange statt range :

 >>> s = u''.join(unichr(c) for c in xrange(0x10ffff+1)) Traceback (most recent call last): File "<stdin>", line 1, in <module> File "<stdin>", line 1, in <genexpr> ValueError: unichr() arg not in range(0x10000) (narrow Python build) 

Whoops: Im Allgemeinen verwenden sys.maxunicode .

 >>> s = u''.join(unichr(c) for c in xrange(sys.maxunicode+1)) >>> import re >>> re.findall(r'\s', s) [u'\t', u'\n', u'\x0b', u'\x0c', u'\r', u' '] 

Whoops: Ummm was über "No-Break Space" etc?

 >>> re.findall(r'\s', chrs, re.UNICODE) [u'\t', u'\n', u'\x0b', u'\x0c', u'\r', u'\x1c', u'\x1d', u'\x1e', u'\x1f', u' ' , u'\x85', u'\xa0', u'\u1680', u'\u180e', u'\u2000', u'\u2001', u'\u2002', u'\u2 003', u'\u2004', u'\u2005', u'\u2006', u'\u2007', u'\u2008', u'\u2009', u'\u200a ', u'\u2028', u'\u2029', u'\u202f', u'\u205f', u'\u3000'] 

Was ist das alles? unicodedata.name ist dein Freund:

 >>> from unicodedata import name >>> for c in re.findall(r'\s', chrs, re.UNICODE): ... print repr(c), name(c, '') ... u'\t' u'\n' u'\x0b' u'\x0c' u'\r' u'\x1c' u'\x1d' u'\x1e' u'\x1f' u' ' SPACE u'\x85' u'\xa0' NO-BREAK SPACE u'\u1680' OGHAM SPACE MARK u'\u180e' MONGOLIAN VOWEL SEPARATOR u'\u2000' EN QUAD u'\u2001' EM QUAD u'\u2002' EN SPACE u'\u2003' EM SPACE u'\u2004' THREE-PER-EM SPACE u'\u2005' FOUR-PER-EM SPACE u'\u2006' SIX-PER-EM SPACE u'\u2007' FIGURE SPACE u'\u2008' PUNCTUATION SPACE u'\u2009' THIN SPACE u'\u200a' HAIR SPACE u'\u2028' LINE SEPARATOR u'\u2029' PARAGRAPH SEPARATOR u'\u202f' NARROW NO-BREAK SPACE u'\u205f' MEDIUM MATHEMATICAL SPACE u'\u3000' IDEOGRAPHIC SPACE 

Es wäre ein bisschen hart, denn Python unterstützt keine POSIX-Zeichenklassen.

Das PyPI Regex Modul funktioniert aber (man muss es selbst installieren).

Der einzige Weg, den ich mir vorstellen kann, alle Unicodes zu extrahieren, die [[:space:]] ist ein bisschen hässlich:

  • Erzeugen Sie einen String aller Unicode-Zeichen
  • Match gegen [[:space:]] .

Ich bin mir sicher, es gibt einen besseren Weg, um stri (die Zeichenfolge aller Unicode-Zeichen) in meinem Code unten zu generieren, also offen für Verbesserungen dort!

 chrs = [unichr(c) for c in range(0x10ffff+1)] # <-- eww that's not very fast! # also we go up to 0x10ffff (inclusive) because that's what help(unichr) says. stri = ''.join(chrs) import re # example if we wanted things matching `\s` with `re` module: re.findall('\s',stri) # --> [u'\t', u'\n', u'\x0b', u'\x0c', u'\r', u' '] # If i had the regex module... # regex.findall("[[:space:]]",stri) 

(Edit – modifizierter Variablenname von str zu stri , um das Überschreiben des eingebauten str Moduls (!) Zu vermeiden)

Um die Antwort für Python 3 zu aktualisieren:

 import re import sys s = ''.join(chr(c) for c in range(sys.maxunicode+1)) ws = ''.join(re.findall(r'\s', s)) >>> ws.isspace() True 

Hier sind die unicode datapoint Zeichen gefunden:

 >>> ws '\t\n\x0b\x0c\r\x1c\x1d\x1e\x1f \x85\xa0\u1680\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u2028\u2029\u202f\u205f\u3000' 

Und wir sehen, dass diese alle als str.strip() von der str.strip() -Methode betrachtet werden:

 >>> len(ws.strip()) 0 

Hier gibt es noch mehr Informationen über die Charaktere:

 from unicodedata import name, category for char in ws: print(hex(ord(char)), repr(char), category(char), name(char, None)) 

In Python 3.5, für mich, druckt:

 0x9 '\t' Cc None 0xa '\n' Cc None 0xb '\x0b' Cc None 0xc '\x0c' Cc None 0xd '\r' Cc None 0x1c '\x1c' Cc None 0x1d '\x1d' Cc None 0x1e '\x1e' Cc None 0x1f '\x1f' Cc None 0x20 ' ' Zs SPACE 0x85 '\x85' Cc None 0xa0 '\xa0' Zs NO-BREAK SPACE 0x1680 '\u1680' Zs OGHAM SPACE MARK 0x2000 '\u2000' Zs EN QUAD 0x2001 '\u2001' Zs EM QUAD 0x2002 '\u2002' Zs EN SPACE 0x2003 '\u2003' Zs EM SPACE 0x2004 '\u2004' Zs THREE-PER-EM SPACE 0x2005 '\u2005' Zs FOUR-PER-EM SPACE 0x2006 '\u2006' Zs SIX-PER-EM SPACE 0x2007 '\u2007' Zs FIGURE SPACE 0x2008 '\u2008' Zs PUNCTUATION SPACE 0x2009 '\u2009' Zs THIN SPACE 0x200a '\u200a' Zs HAIR SPACE 0x2028 '\u2028' Zl LINE SEPARATOR 0x2029 '\u2029' Zp PARAGRAPH SEPARATOR 0x202f '\u202f' Zs NARROW NO-BREAK SPACE 0x205f '\u205f' Zs MEDIUM MATHEMATICAL SPACE 0x3000 '\u3000' Zs IDEOGRAPHIC SPACE 
  • Matching nur ein Unicode-Brief in Python re
  • Was ist der schnellste Weg zu streifen und ersetzen ein Dokument von hohen Unicode-Zeichen mit Python?
  • Python - 'ascii' Codec kann kein Byte decodieren
  • Unicode-Codierung / Decodierung
  • Python unichr problem
  • Unicode-Identifikatoren in Python?
  • Warum gibt Python 2's raw_input die Unicode-Strings aus?
  • Python Unicode UnicodeEncodeError
  • Was ist der beste Weg, um Akzente in einem Python Unicode String zu entfernen?
  • Json.loads () gibt Ausnahme, dass es einen Wert erwartet, sieht aus wie Wert ist da
  • Python-Matplotlib-Achsen-Etiketten-Index auf Basis des Schleifenzählers
  • Python ist die beste Programmiersprache der Welt.