2016-07-31 24 views
2

私はすべての絵文字を''に置き換えたいが、私のregExは機能しません。例えば
python-re.sub()とunicode

content= u'?\u86cb\u767d12\U0001f633\uff0c\u4f53\u6e29\u65e9\u6668\u6b63\u5e38\uff0c\u5348\u540e\u665a\u95f4\u53d1\u70ed\uff0c\u6211\u73b0\u5728\u8be5\u548b\U0001f633?' 

と私はので、私はコードを書く''\U0001f633のようなすべてのフォームを置き換えたい:

print re.sub(ur'\\U[0-9a-fA-F]{8}','',content)

をしかし、それは動作しません。
ありがとうございました。

答えて

3

正しくデコードされたユニコードコードポイントは、(\uXXXXなどの文字列として)正しく認識できません。正しく正規表現されたパーサーが到達するまでに、それぞれが*文字です。あなたのpythonは、わずか16ビットUnicodeコードポイントかないでコンパイルされたかどうかに応じて

は、次のようなパターンのものをお勧めします、次のいずれか

# 16-bit codepoints 
re_strip = re.compile(u'[\uD800-\uDBFF][\uDC00-\uDFFF]') 

# 32-bit* codepoints 
re_strip = re.compile(u'[\U00010000-\U0010FFFF]') 

そして、あなたのコードは次のようになります。

import re 

# Pick a pattern, adjust as necessary 
#re_strip = re.compile(u'[\uD800-\uDBFF][\uDC00-\uDFFF]') 
re_strip = re.compile(u'[\U00010000-\U0010FFFF]') 

content= u'[\u86cb\u767d12\U0001f633\uff0c\u4f53\u6e29\u65e9\u6668\u6b63\u5e38\uff0c\u5348\u540e\u665a\u95f4\u53d1\u70ed\uff0c\u6211\u73b0\u5728\u8be5\u548b\U0001f633]' 
print(content) 

stripped = re_strip.sub('', content) 
print(stripped) 

両方の式は、これらの表現は、あなたがBU、後にした絵文字を取り除く26

stripped文字列の文字数を減らします他のものを取り除くこともありませんdoしたいです。ユニコードコードポイントの範囲リスト(例:here)を見直して調整する価値があります。これは、16が表示された場合は、あなたが最初の正規表現式が必要になります

import sys 
print(sys.maxunicode.bit_length()) 

:あなたはあなたのPythonがインストールするかどうかを判断することができます

だけのような何かを行うことによって、16ビットのコードポイントを認識します。それが16より大きい何かを表示するなら(私には21と言う)、2番目はあなたが望むものです。

いずれの式も、pythonインストールで間違ったsys.maxunicodeを使用しても機能しません。

も参照してください:this related。

+0

ありがとうございました。できます。しかし、あなたはそれがまた私が望む他のものを取り除くかもしれないと言います。では、絵文字だけを削除したいのですが?内容は、中国語の文字、数字、文字、句読点、絵文字を含むことがあります。ところで、私のPythonは、16ビットのUnicodeコードポイントだけでコンパイルされます。 – sophiaCY

+0

まあ、かもしれない*。私が "フィルタリング"しているコードポイントは10000 [ここ](http://jrgraphix.net/research/unicode_blocks.php)から始まります。したがって、「線形B音階」の「タグ」を使用しています。私の経験では、ほとんどのフォントはこれらのコードポイントのグリフを持っていません。だからあなたが望むことがその範囲にあることは(非常に)起こりそうもないので、フィルタリングはおそらく大丈夫ですが、それはただ知っておくべきことです。 – jedwards