Python:Unicode文字列にケース付き文字が含まれているかどうかを確認する方法は?

StackOverflow https://stackoverflow.com/questions/3508490

質問

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文字カテゴリのリストを見つけることができます

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top