8

Unicode (utf-8 エンコーディング) 文字列に大文字が含まれていないかどうかを確認するフィルターを実行しています (すべての言語で)。文字列に大文字と小文字がまったく含まれていなくても問題ありません。

例: 「こんにちは!」はフィルターを通過しませんが、「!」"!" であるため、フィルターを通過する必要があります。大文字小文字ではありません。

islower() メソッドを使用する予定でしたが、上記の例では "!".islower() が False を返します。

Python Docs によると、「python unicode メソッド islower() は、Unicode 文字列の大文字と小文字が区別された文字がすべて小文字であり、文字列に大文字と小文字が区別された文字が少なくとも 1 つ含まれている場合に True を返し、それ以外の場合は False を返します。」

文字列に大文字と小文字が区別された文字が含まれていない場合も、このメソッドは False を返します。"!"、文字列に大文字と小文字が区別された文字が含まれているかどうかを確認したい。

このようなもの....

string = unicode("!@#$%^", 'utf-8')

#check first if it contains cased characters
if not contains_cased(string):
     return True

return string.islower():

contains_cased() 関数に関する提案はありますか?

それとも、おそらく別の実装アプローチですか?

ありがとう!

4

3 に答える 3

8
import unicodedata as ud

def contains_cased(u):
  return any(ud.category(c)[0] == 'L' for c in u)
于 2010-08-18T02:25:05.453 に答える
8

Unicode 文字カテゴリの完全なスクープは次のとおりです

レターのカテゴリは次のとおりです。

Ll -- lowercase
Lu -- uppercase
Lt -- titlecase
Lm -- modifier
Lo -- other

注意してくださいLl <-> islower(); についても同様ですLu(Lu or Lt) <-> istitle()

Lm文字に関する議論を含む、ケーシングに関する複雑な議論を読みたいと思うかもしれません。

すべての「文字」をやみくもに扱うのは明らかに間違っています。この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 が実際に何を意味するかについては、さらに調査する必要があります。

于 2010-08-18T08:08:26.997 に答える
1

使用モジュールunicodedata,

unicodedata.category(character)

Ll小文字の場合は " " を返し、大文字の場合は " " を返しLuます。

ここでは、Unicode 文字カテゴリのリストを見つけることができます

于 2010-08-18T02:27:46.367 に答える