文字列のすべてを英小文字と空白文字を除いて取り除こうとしています。私はこのようなUnicode文字を使用する場合Pythonの正規表現がユニコードで動作しない
問題がある:
re.sub(r'[^a-å_\s]', '', '¤☃')
これは、私はそれについて何ができる理由は削除されませんか?
文字列のすべてを英小文字と空白文字を除いて取り除こうとしています。私はこのようなUnicode文字を使用する場合Pythonの正規表現がユニコードで動作しない
問題がある:
re.sub(r'[^a-å_\s]', '', '¤☃')
これは、私はそれについて何ができる理由は削除されませんか?
use Unicodeとすることができます。
>>> re.sub(ur'[^a-å_\s]', u'', u'¤☃')
u'\xa4'
>>> print re.sub(ur'[^a-å_\s]', u'', u'¤☃')
¤
これを行うと、上記と同じ結果が返されます。これらの文字を除外したいが、それは起こっていない。 – user7179775
あなたは、このように非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æøø
デンマーク語の文字 'æ' 'ø' 'å'を保持したい場合を除き、これを行うにはどうすればよいですか? – user7179775
私は自分の答えを編集しました。 – grzgrzgrz3
これもすべてのシンボルを取り除くわけではありません。#@のようなものですが、まだ通過します。 – user7179775
その他は、すでにあなたが適切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'
をその入力から予想される出力は何ですか? – depperm
入力が 'a¤b☃c'の場合は何もありません。小文字の英数字と空白以外はすべて削除しようとしているので、出力は 'abc'になりますか? – user7179775