小文字 - python 文字列 置換
Pythonで文字列を小文字にするには? (4)
Pythonで文字列を小文字に変換するには?
ユーザーが入力した文字列全体を大文字または大文字から小文字に変換する方法はありますか?
例:キロメートル - >キロメートル
これを行う正規のPythonの方法は次のとおりです
>>> 'Kilometers'.lower()
'kilometers'
しかし、大文字と小文字を区別しないマッチングを行うのが目的ならば、大文字と小文字を区別する必要があります。
>>> 'Kilometers'.casefold()
'kilometers'
理由は次のとおりです。
>>> "Maße".casefold()
'masse'
>>> "Maße".lower()
'maße'
>>> "MASSE" == "Maße"
False
>>> "MASSE".lower() == "Maße".lower()
False
>>> "MASSE".casefold() == "Maße".casefold()
True
これはPython 3のstrメソッドですが、Python 2ではPyICUまたはpy2casefoldを見たいと思っています。
Unicode Python 3
Python 3はunicodeを通常の文字列として扱います:
>>> string = 'Километр'
>>> string
'Километр'
>>> string.lower()
'километр'
Unicode Python 2
しかし、Python 2はシェルにペーストされていませんが、 utf-8
を使ってリテラルをバイト列としてエンコードします。
また、 lower
はネイティブのUnicodeオブジェクトが認識している変更をマップしないので、同じ文字列を取得します。
>>> string = 'Километр'
>>> string
'\xd0\x9a\xd0\xb8\xd0\xbb\xd0\xbe\xd0\xbc\xd0\xb5\xd1\x82\xd1\x80'
>>> string.lower()
'\xd0\x9a\xd0\xb8\xd0\xbb\xd0\xbe\xd0\xbc\xd0\xb5\xd1\x82\xd1\x80'
>>> print string.lower()
Километр
スクリプトでは、Pythonは非ASCII文字(Python 2.5以降、およびPython 2.4での警告)バイトに、エンコーディングが指定されていない文字列にあることに反対します。これは、意図したコーディングがあいまいであるためです。 詳細は、 docsとPEP 263の Unicodeの使い方を参照してください。
Unicodeリテラルを使用します.strリテラルは使用しないでください。
ユニコードリテラルで簡単に達成できるこの変換を処理するには、 unicode
文字列が必要です。
>>> unicode_literal = u'Километр'
>>> print unicode_literal.lower()
километр
バイトはstr
バイトとは完全に異なることに注意してください。エスケープ文字は'\u'
後に2バイト幅、またはこれらのunicode
文字の16ビット表現です。
>>> unicode_literal
u'\u041a\u0438\u043b\u043e\u043c\u0435\u0442\u0440'
>>> unicode_literal.lower()
u'\u043a\u0438\u043b\u043e\u043c\u0435\u0442\u0440'
今、 str
の形式でしかそれを持っていなければ、それをunicode
に変換する必要がありstr
。 PythonのUnicode型は、他のほとんどのエンコーディングに比べて多くのadvantagesを持つユニバーサルエンコーディング形式です。 unicode
コンストラクタまたはstr.decode
メソッドをコーデックとともに使用して、 str
をunicode
に変換することができstr
。
>>> unicode_from_string = unicode(string, 'utf-8') # "encoding" unicode from string
>>> print unicode_from_string.lower()
километр
>>> string_to_unicode = string.decode('utf-8')
>>> print string_to_unicode.lower()
километр
>>> unicode_from_string == string_to_unicode == unicode_literal
True
どちらのメソッドもUnicode型に変換されます。これはunicode_literalと同じです。
ベストプラクティス、Unicodeを使用する
常にUnicodeでテキストを操作することをお勧めします。
ソフトウェアはUnicode文字列で内部的にしか動作せず、出力時に特定のエンコーディングに変換する必要があります。
必要に応じてエンコードすることができます
しかし、小文字をstr
型に戻すには、python文字列をutf-8
再度エンコードしstr
。
>>> print string
Километр
>>> string
'\xd0\x9a\xd0\xb8\xd0\xbb\xd0\xbe\xd0\xbc\xd0\xb5\xd1\x82\xd1\x80'
>>> string.decode('utf-8')
u'\u041a\u0438\u043b\u043e\u043c\u0435\u0442\u0440'
>>> string.decode('utf-8').lower()
u'\u043a\u0438\u043b\u043e\u043c\u0435\u0442\u0440'
>>> string.decode('utf-8').lower().encode('utf-8')
'\xd0\xba\xd0\xb8\xd0\xbb\xd0\xbe\xd0\xbc\xd0\xb5\xd1\x82\xd1\x80'
>>> print string.decode('utf-8').lower().encode('utf-8')
километр
したがって、Python 2では、UnicodeはPython文字列にエンコードでき、Python文字列はUnicode型にデコードできます。
文字列を大文字、または大文字から小文字に変換する方法はありますか?
例:キロメートル - >キロメートル。
Python 2では、これはUTF-8の英語以外の単語では機能しません。 この場合、 decode('utf-8')
は以下を支援します:
>>> s='Километр'
>>> print s.lower()
Километр
>>> print s.decode('utf-8').lower()
километр
これを試してはいけない、完全に推奨しない、これをしないでください:
import string
s='ABCD'
print(''.join([string.ascii_lowercase[string.ascii_uppercase.index(i)] for i in s]))
出力:
abcd
誰もまだ書いていないので、 swapcase
を使うことができます(大文字は小文字になります。逆も同様です)。
s='ABCD'
print(s.swapcase())
出力:
abcd
また、いくつかの変数を上書きすることもできます:
s = input('UPPER CASE')
lower = s.lower()
このように使うと:
s = "Kilometer"
print(s.lower()) - kilometer
print(s) - Kilometer
呼び出されたときだけ動作します。