2

重複の可能性:
Python では、POSIX 拡張正規表現 `[:space:]` に一致するすべての文字を一覧表示する方法は?

PythonでUTF-8のすべての空白のリストを取得するにはどうすればよいですか? 非改行スペースなどを含みます。私はpython 2.7を使用しています。

4

3 に答える 3

9

unicodedata.category特定の文字のカテゴリコードを教えてくれます。必要な文字にはコードがありますZs。すべての文字を反復処理する以外に、カテゴリ内の文字のリストを抽出する方法はないようです。

>>> for c in xrange(sys.maxunicode+1):
...     u = unichr(c)
...     if unicodedata.category(u) == 'Zs':
...         sys.stdout.write("U+{:04X} {}\n".format(c, unicodedata.name(u)))
... 
U+0020 SPACE
U+00A0 NO-BREAK SPACE
U+1680 OGHAM SPACE MARK
U+180E MONGOLIAN VOWEL SEPARATOR
U+2000 EN QUAD
U+2001 EM QUAD
U+2002 EN SPACE
U+2003 EM SPACE
U+2004 THREE-PER-EM SPACE
U+2005 FOUR-PER-EM SPACE
U+2006 SIX-PER-EM SPACE
U+2007 FIGURE SPACE
U+2008 PUNCTUATION SPACE
U+2009 THIN SPACE
U+200A HAIR SPACE
U+202F NARROW NO-BREAK SPACE
U+205F MEDIUM MATHEMATICAL SPACE
U+3000 IDEOGRAPHIC SPACE

(注:Python 3.4以降を使用してこのテストを行うと、MONGOLIAN VOWELSEPARATORはリストに表示されません。Python2.7にはUnicode5.2のデータが付属しています。この文字は、Unicode 6.3で一般カテゴリCf(「フォーマット制御」)として再分類されました。 、これはPython 3.4がデータに使用したバージョンです。https://codeblog.jonskeet.uk/2014/12/01/when-is-an-identifier-not-an-identifier-attack-of-the-を参照してください。おそらく必要以上の詳細については、mongolian-vowel-separator /およびhttps://www.unicode.org/L2/L2013/13004-vowel-sep-change.pdfを参照してください。)

Zlカテゴリとを含めることもできますZp。これにより、

U+2028 LINE SEPARATOR
U+2029 PARAGRAPH SEPARATOR

そして、あなたはほぼ間違いなく、通常空白と見なされるすべてのASCII制御文字を含めたいと思うでしょう-歴史的な理由から(私は推測します)、これらはカテゴリにありますCc

U+0009 CHARACTER TABULATION  ('\t')
U+000A LINE FEED (LF)        ('\n')
U+000B LINE TABULATION       ('\v')
U+000C FORM FEED (FF)        ('\r')
U+000D CARRIAGE RETURN (CR)  ('\f')

他の60余りの文字は、正式な名前で空白のように聞こえても、空白と見なすCcべきではありません。たとえば、その公式の意味で野生で遭遇することはほとんどありません。Windows-1252からのUTF-8への誤った変換の結果である可能性がはるかに高くなります。U+0085 NEXT LINEU+2026 HORIZONTAL ELLIPSIS

密接に関連する質問は、「\sPython正規表現で何が一致するか」です。この質問に答える最良の方法は、すべての文字を繰り返すことです。

>>> s = re.compile(ru"^\s$", re.UNICODE)
>>> for c in range(sys.maxunicode+1):
...   u = unichr(c)
...   if s.match(u):
...      sys.stdout.write("U+{:04X} {}\n".format(
...        c, unicodedata.name(u, "<name missing>")))
U+0009 <name missing>
U+000A <name missing>
U+000B <name missing>
U+000C <name missing>
U+000D <name missing>
U+001C <name missing>
U+001D <name missing>
U+001E <name missing>
U+001F <name missing>
U+0020 SPACE
U+0085 <name missing>
U+00A0 NO-BREAK SPACE
U+1680 OGHAM SPACE MARK
U+180E MONGOLIAN VOWEL SEPARATOR
U+2000 EN QUAD
U+2001 EM QUAD
U+2002 EN SPACE
U+2003 EM SPACE
U+2004 THREE-PER-EM SPACE
U+2005 FOUR-PER-EM SPACE
U+2006 SIX-PER-EM SPACE
U+2007 FIGURE SPACE
U+2008 PUNCTUATION SPACE
U+2009 THIN SPACE
U+200A HAIR SPACE
U+2028 LINE SEPARATOR
U+2029 PARAGRAPH SEPARATOR
U+202F NARROW NO-BREAK SPACE
U+205F MEDIUM MATHEMATICAL SPACE
U+3000 IDEOGRAPHIC SPACE

(制御文字の名前がわからない理由はわかりunicodedata.nameません。この場合も、Python 3.4以降を使用してこのテストを実行すると、MONGOLIAN VOWEL SEPARATORはリストに表示されません。)

これはZ*、すべての文字、一般的に空白であると認められているすべての文字、および一般的に空白であると認められていないCc5つの追加文字、U + 001C、U + 001D、U + 001E、U + 001F、およびUです。 +0085。最後のグループを含めることはバグですが、これらの文字を何かに使用することバグであるため、ほとんど無害です。

于 2013-01-09T19:52:34.047 に答える
3

Zsカテゴリでは不十分な場合があります:

#!/usr/bin/env python
import sys
import unicodedata

import regex # $ pip install regex

for i in xrange(sys.maxunicode + 1):
    u = unichr(i)
    if regex.match(u"[[:space:]]", u):
        try:
            name = unicodedata.name(u)
        except ValueError:
            name = ""
        print("{:9s} {} {}".format(repr(u), unicodedata.category(u), name))

出力

u'\t'     Cc 
u'\n'     Cc 
u'\x0b'   Cc 
u'\x0c'   Cc 
u'\r'     Cc 
u' '      Zs SPACE
u'\x85'   Cc 
u'\xa0'   Zs NO-BREAK SPACE
u'\u1680' Zs OGHAM SPACE MARK
u'\u180e' Zs MONGOLIAN VOWEL SEPARATOR
u'\u2000' Zs EN QUAD
u'\u2001' Zs EM QUAD
u'\u2002' Zs EN SPACE
u'\u2003' Zs EM SPACE
u'\u2004' Zs THREE-PER-EM SPACE
u'\u2005' Zs FOUR-PER-EM SPACE
u'\u2006' Zs SIX-PER-EM SPACE
u'\u2007' Zs FIGURE SPACE
u'\u2008' Zs PUNCTUATION SPACE
u'\u2009' Zs THIN SPACE
u'\u200a' Zs HAIR SPACE
u'\u2028' Zl LINE SEPARATOR
u'\u2029' Zp PARAGRAPH SEPARATOR
u'\u202f' Zs NARROW NO-BREAK SPACE
u'\u205f' Zs MEDIUM MATHEMATICAL SPACE
u'\u3000' Zs IDEOGRAPHIC SPACE
于 2013-01-09T20:39:25.357 に答える
0

Unicodeデータベースの公式スペース文字のリストは、「Zs」カテゴリで定義されています。

http://www.fileformat.info/info/unicode/category/Zs/list.htm

Pythonのunicodedataモジュールに機能があるかどうかはわかりません。私は疑います:あなたはすべてのキャラクターを調べて、それらのカテゴリーを「Z」と照合することができます。

于 2013-01-09T19:52:02.853 に答える