Python:Unicode文字列にケース付き文字が含まれているかどうかを確認する方法は?
質問
Unicode(UTF-8エンコーディング)文字列に大文字(すべての言語)が含まれていないかどうかを確認するフィルターを実行しています。文字列にケース付きの文字がまったく含まれていない場合は、私には問題ありません。
例:「こんにちは!」フィルターを渡すのではなく、「!」 「!」からフィルターを渡す必要があります。ケースのキャラクターではありません。
iSlower()メソッドを使用する予定でしたが、上記の例では「!」。ISLOWER()はfalseを返します。
Python Docsによると、「Python UnicodeメソッドIslower()は、Unicode文字列のケース文字がすべて小文字であり、文字列に少なくとも1つのケース付き文字が含まれている場合、trueを返します。
このメソッドは、文字列にケース付き文字が含まれていない場合にfalseも返すためです。 「!」、文字列にケース付きの文字が含まれているかどうかを確認したい。
このようなもの....
string = unicode("!@#$%^", 'utf-8')
#check first if it contains cased characters
if not contains_cased(string):
return True
return string.islower():
contains_cased()関数の提案はありますか?
またはおそらく別の実装アプローチですか?
ありがとう!
解決
ここ Unicode文字カテゴリの完全なスクープです。
文字カテゴリには次のものがあります。
Ll -- lowercase
Lu -- uppercase
Lt -- titlecase
Lm -- modifier
Lo -- other
ご了承ください Ll <-> islower()
;同様に Lu
; (Lu or Lt) <-> istitle()
ケーシングに関する複雑な議論を読むことをお勧めします。 Lm
手紙。
すべての「文字」をCasedとして盲目的に扱うことは、明らかに間違っています。 Lo
カテゴリには、BMPの45301コードポイントが含まれます(Python 2.6を使用してカウント)。これらの大部分は、ハングル音節、CJKの包み文字、および他の東アジアのキャラクターであり、それらが「ケース」と見なされる方法を理解するのが非常に困難です。
あなたが期待する「ケース型文字」の(不特定の)動作に基づいて、別の定義を考慮したいかもしれません。これが簡単な最初の試みです:
>>> cased = lambda c: c.upper() != c or c.lower() != c
>>> sum(cased(unichr(i)) for i in xrange(65536))
1970
>>>
興味深いことに、1216 x llと937 x luがあり、合計2153 ... LLとLUの意味をさらに調査するための範囲があります。
他のヒント
import unicodedata as ud
def contains_cased(u):
return any(ud.category(c)[0] == 'L' for c in u)
モジュールを使用します unicodedata
,
unicodedata.category(character)
戻り値 "Ll
「小文字のために」Lu
「大文字の場合。
ここ Unicode文字カテゴリのリストを見つけることができます