4

より大きい文字のユニコード「文字列」を解析するにはどうすればよい\uFFFFですか?

試しreてみregexましたが、2 つの 16 進数値を超える Unicode 文字と正しく一致していないようです。

任意の Unicode 文字列を取得します (たとえば、でエンコードされたツイート テキストutf-8)

emotes = regex.findall('[\u263A\u263B\u062A\u32E1]',tweet_json_obj['text'])
if emotes: print "Happy:{0}".format(len(emotes))

出力は、テキスト内に含まれるスマイリー フェイスの数です。

しかし、ユニコード文字の絵文字セットに一致させようとすると: http://www.fileformat.info/info/unicode/block/emoticons/index.htm

emotes = regex.findall('[\u01F600-\u01F64F]',tweet_json_obj['text'])
if emotes: print "Emoticon:{0}".format(len(emotes))

出力は、文字列内のすべての文字から空白を除いた (数値) 一致です。正規表現がツイート内のすべての文字、または少なくとも string.printable のように見えるものと一致するのはどうしてですか?

期待される結果は、データセットの大部分で 0 が返されることです。人々がこれらの絵文字を挿入するとは思わないからです。私の正規表現は間違っていますか?

4

1 に答える 1

4

BMP以外のコードポイント\Uxxxxxxxx(大文字Uと 8 つの 16 進文字) を使用します。を使用しています。これは4 つの16 進文字\uxxxxのみを使用します。これは Unicode コードポイントの一部ではありません。00

>>> len(u'\u01f600')
3
>>> len(u'\U0001f600')
1
>>> u'\u01f600'[0]
'\u01f6'
>>> u'\u01f600'[1:]
'00'

unicodeここでパターンを使用する必要があります。

u'[\U0001F600-\U0001F64F]'

デモ:

>>> import re
>>> re.search(u'[\U0001F600-\U0001F64F]', u'\U0001F600')
<_sre.SRE_Match object at 0xb73ead08>

UCS4 Python ビルドを使用する必要があります。そうしないと、BMP 以外のコードポイントが UTF16 サロゲート ペアを使用して実装され、正規表現ではうまく機能しません。

2 を返す場合len(u'\U0001f600')は、代わりに狭い UCS2 ビルドを使用しているか、または ; を参照してくださいsys.maxunicode。ワイド ビルドは 1114111 を返し、ナロー ビルドは 65535 を返します。

UCS2 システムでは、この特定のケースでは、UTF16 サロゲートを式と一致させることもできます。

ur'\ud83d[\ude00-\ude4f]'

これは、 と同じ範囲を構成する UTF-16 サロゲート ペアと一致します[\U0001F600-\U0001F64F]が、狭いビルドでは次のようになります。

>>> import sys
>>> sys.maxunicode
65535
>>> import re
>>> re.search(u'\ud83d[\ude00-\ude4f]', u'\U0001F600')
<_sre.SRE_Match object at 0x105e9f5e0>
于 2013-11-13T23:17:35.417 に答える