2016-11-18 9 views
0

文字列のすべてを英小文字と空白文字を除いて取り除こうとしています。私はこのようなUnicode文字を使用する場合Pythonの正規表現がユニコードで動作しない

問題がある:

re.sub(r'[^a-å_\s]', '', '¤☃') 

これは、私はそれについて何ができる理由は削除されませんか?

+0

をその入力から予想される出力は何ですか? – depperm

+0

入力が 'a¤b☃c'の場合は何もありません。小文字の英数字と空白以外はすべて削除しようとしているので、出力は 'abc'になりますか? – user7179775

答えて

2

use Unicodeとすることができます。

>>> re.sub(ur'[^a-å_\s]', u'', u'¤☃') 
u'\xa4' 
>>> print re.sub(ur'[^a-å_\s]', u'', u'¤☃') 
¤ 
+0

これを行うと、上記と同じ結果が返されます。これらの文字を除外したいが、それは起こっていない。 – user7179775

0

あなたは、このように非ASCII文字を削除することができます。

>>> import re 
>>> 
>>> print re.sub(ur'[^\x00-\x7F]', u'', u'123aąść1b2d3') 
123a1b2d3 

あなたには、いくつかの追加の非ASCIIだけで正規表現に追加perserveします。

print re.sub(ur'[^\x00-\x7Fæøø]', u'', u'123aąść1b2d3æøø') 
123a1b2d3æøø 
+0

デンマーク語の文字 'æ' 'ø' 'å'を保持したい場合を除き、これを行うにはどうすればよいですか? – user7179775

+0

私は自分の答えを編集しました。 – grzgrzgrz3

+0

これもすべてのシンボルを取り除くわけではありません。#@のようなものですが、まだ通過します。 – user7179775

0

その他は、すでにあなたが適切unicodeで動作するようにunicode引数でunicode正規表現が必要であることを説明しました。 Pythonは'¤☃'をコード化された形で格納することが多く、入力を'\xc2\xa4\xe2\x98\x83'として保存するUTF-8が多く、正規表現自体は'[^a-\xc3\xa5+_\\s]'であるため、文字クラスは空白と序数を97から195に除外します、それは前の範囲にあります)、97〜229の序列からは期待していません。これは、UTF-8でエンコードされた入力がこの範囲のバイトで表されるためです(ドロップされたe2バイトを除いて)、出力は軽くフィルタリングされます。

unicodeを正しく使用しても、ord(u'¤')は164、ord(u'å')は229です。あなたが置換から除外した文字クラスにあるので、正しく¤を保存します。

ここで正規表現を使用するべきではありません。Unicode範囲に分散しているすべてのアルファベットと空白文字を完全に定義するのは実際的ではないためです。代わりに、実際に文字プロパティを検査するUnicodeデータベースを使用するツールを使用します。

についてより明確だ
>>> u''.join(x for x in u'a¤ ☃b' if x.isspace() or x.islower()) 
u'a b' 

まさにあなたがやろうとしていて、それが十分に高速である必要があります。 Pythonが使用するUnicodeデータベースは、文字属性をチェックするコストをかなり軽減します。あなたの入力はstr(UTF-8としてエンコード)として到着していて、str出力を生成しなければならない、あなただけのunicodeへの変換、フィルタ場合は、バック変換:

>>> inp = 'a¤ ☃b' # Not unicode! 
>>> inpuni = inp.decode('utf-8') 
>>> outpuni = u''.join(x for x in inpuni if x.isspace() or x.islower()) 
>>> outp = outpuni.encode('utf-8') 
>>> outp 
'a b' 
関連する問題