Python 文字列

Python には、多くの便利な機能を備えた「str」という文字列クラスが組み込まれています(使用すべきでない「string」という名前の古いモジュールがあります)。文字列リテラルは二重引用符または一重引用符で囲むことができますが、一般的には一重引用符が使用されます。バックスラッシュによるエスケープは、一重引用符と二重引用符で囲まれている場合、通常の方法で動作します(例: \n \' \")。二重引用符で囲まれた文字列リテラルには、何もせずに一重引用符を含めることができ(例: "I don't do it")、同様に、一重引用符で囲まれた文字列には二重引用符を含めることができます。文字列リテラルは複数行にまたがってかまいませんが、改行をエスケープするには、各行の最後にバックスラッシュ「\」が必要です。三重引用符(""" または ''')で囲まれた文字列リテラルは、複数行のテキストにまたがることができます。

Python の文字列は「不変」であり、作成後に変更することはできません(Java 文字列でもこの不変のスタイルが使用されます)。文字列は変更できないため、計算された値を表す新しい文字列を構築します。たとえば、式 ('hello' + 'there') は、2 つの文字列「hello」と「there」を受け取り、新しい文字列「hellothere」を構築します。

文字列内の文字には、標準の [ ] 構文を使用してアクセスできます。Java や C++ と同様に、Python ではゼロから始まるインデックスを使用するため、s が 'hello' の場合、s[1] は 'e' になります。インデックスが文字列の範囲外の場合、Python はエラーをスローします。Python スタイルは(Perl とは異なり)デフォルト値を作り出すのではなく、何をすべきか指示できない場合は中止するようになっています。便利な「スライス」構文(下記)も、文字列から部分文字列を抽出するときに使用できます。len(string) 関数は、文字列の長さを返します。[ ] 構文と len() 関数は実際には、文字列やリストなど、どのようなシーケンス型でも機能します。Python は、異なる型に対しても同じように処理を実行しようと努めます。Python 初心者の問題: len() 関数がブロックされないようにするため、変数名として「len」を使用しないでください。「+」演算子を使用すると、2 つの文字列を連結できます。以下のコードでは、変数は事前に宣言されているわけではありません。変数に代入してそのまま実行してください。

  s = 'hi'
  print(s[1])          ## i
  print(len(s))        ## 2
  print(s + ' there')  ## hi there

Java とは異なり、「+」では数値などの型が自動的に文字列形式に変換されることはありません。str() 関数は、値を文字列形式に変換して、他の文字列と結合できるようにします。

  pi = 3.14
  ##text = 'The value of pi is ' + pi      ## NO, does not work
  text = 'The value of pi is '  + str(pi)  ## yes

数値の場合、標準の演算子である +、/、* は通常どおり機能します。++ 演算子はありませんが、+=、-= などは機能します。整数の除算が必要な場合は、スラッシュを 2 つ使用します(例: 6 // 5 は 1 です)。

通常、「print」関数を使用すると、1 つ以上の Python 項目が出力され、その後に改行が続きます。「raw」文字列リテラルは、「r」が接頭辞として付加され、バックスラッシュの特別な処理なしですべての文字が渡されます。したがって、r'x\nx' は長さ 4 の文字列「x\nx」と評価されます。 "print" は、出力方法を変更するための複数の引数を取ることができます(python.org の出力関数定義を参照)。たとえば、"end" を "" に設定すると、すべての項目の出力が終了した後に改行が出力されなくなります。

  raw = r'this\t\n and that'

  # this\t\n and that
  print(raw)

  multi = """It was the best of times.
  It was the worst of times."""

  # It was the best of times.
  #   It was the worst of times.
  print(multi)

文字列メソッド

ここでは、最も一般的な文字列メソッドをいくつか紹介します。メソッドは関数に似ていますが、オブジェクトに対して実行されます。変数 s が文字列の場合、コード s.lower() はその文字列オブジェクトに対して lower() メソッドを実行し、結果を返します(オブジェクトで実行されるメソッドという考え方は、オブジェクト指向プログラミング(OOP)を構成する基本的な考え方の 1 つです)。最も一般的な文字列メソッドは次のとおりです。

  • s.lower()、s.upper() -- 文字列の小文字または大文字のバージョンを返す
  • s.strip() -- 先頭と末尾から空白を取り除いた文字列を返す
  • s.isalpha()/s.isdigit()/s.isspace()... -- すべての文字列文字が各種文字クラスに含まれているかどうかをテストします。
  • s.startswith('other'), s.endswith('other') -- 文字列が指定された他の文字列で開始または終了するかどうかをテストします
  • s.find('other') -- 指定した他の文字列(正規表現ではない)を s 内で検索し、先頭にある最初のインデックスを返します。見つからない場合は -1 です。
  • s.replace('old', 'new') -- 「old」をすべて「new」に置き換えた文字列を返します
  • s.split('delim') -- 指定した区切り文字で区切られた部分文字列のリストを返します。区切り文字は正規表現ではなくテキストです。'aaa,bbb,ccc'.split(',') -> ['aaa', 'bbb', 'ccc'] のように指定します。便利な特殊なケースの s.split() として、すべての空白文字を(引数なし)で分割します。
  • s.join(list) --split() の逆。文字列を区切り文字として使用して、指定されたリスト内の要素を結合します。例: '---'.join(['aaa', 'bbb', 'ccc']) -> aaa---bbb---ccc

Google で「python str」を検索すると、すべての str メソッドがリストされた公式の python.org の文字列メソッドが表示されます。

Python には個別の文字型がありません。代わりに、s[8] のような式は、その文字を含む string-length-1 を返します。この string-length-1 では、演算子 ==、<=、... はすべて期待どおりに動作するので、ほとんどの場合、Python には個別のスカラー「char」型がないことを知っている必要はありません。

文字列スライス

「スライス」構文は、シーケンスのサブ部分(通常は文字列やリスト)を参照するための便利な方法です。スライス s[start:end] は、start から始まり、end まで伸びる要素です(end は含みません)。s = "Hello" であるとします。

文字インデックス 0 1 2 3 4 を含む文字列 &#39;hello&#39;

  • s[1:4] が「ell」 -- インデックス 1 から始まりインデックス 4 までの範囲の文字
  • s[1:] は「ello」です -- インデックスを省略すると、デフォルトで文字列の先頭または末尾になります
  • s[:] は「Hello」です。両方を省略すると、常に全体のコピーが返されます(これは、文字列やリストなどのシーケンスをコピーする Python の方法です)。
  • s[1:100] は「ello」です。大きすぎるインデックスは文字列の長さまで切り捨てられます

標準のゼロから始まるインデックス番号により、文字列の先頭付近の文字に簡単にアクセスできます。代わりに Python では負の数を使って、文字列の最後にある文字に簡単にアクセスできるようにします。たとえば、s[-1] は最後の文字「o」、s[-2] は「l」、最後の文字は「l」というようになります。負のインデックス番号は、文字列の末尾からカウントされます。

  • s[-1] が「o」 -- 最後の文字(末尾から 1 番目)
  • s[-4] が「e」 -- 末尾から 4 番目
  • 「s[:-3]」が「He」で、末尾の 3 文字を除く。
  • s[-3:] は「llo」で、末尾から 3 番目の文字から文字列の終わりまでが続きます。

これは、任意のインデックス n、s[:n] + s[n:] == s に対応するスライスのわかりやすい方法です。これは、n 個の負の値または境界外の場合でも機能します。言い換えると、s[:n] と s[n:] は常に文字列を 2 つの文字列部分に分割し、すべての文字を保存します。後述するリスト セクションで説明するように、スライスはリストでも機能します。

文字列形式

Python では、出力に適した文字列にオブジェクトを自動的に変換できます。これを行う方法として、「f-strings」とも呼ばれるフォーマットされた文字列リテラルと、str.format() を呼び出す 2 つの組み込みの方法があります。

書式設定された文字列リテラル

書式設定された文字列リテラルは、次のような状況でよく使用されます。

  value = 2.791514
  print(f'approximate value = {value:.2f}')  # approximate value = 2.79

  car = {'tires':4, 'doors':2}
  print(f'car = {car}') # car = {'tires': 4, 'doors': 2}

書式設定されたリテラル文字列には接頭辞「f」が付きます(未加工の文字列で使用される「r」接頭辞と同様)。中括弧「 {} 」の外のテキストは、直接出力されます。「 {}」に含まれる式は、形式の仕様で説明されている形式仕様を使用して出力されます。切り捨てや指数表記への変換、左/右/中央揃えなど、さまざまな書式設定を便利に活用できます。

f-string は、オブジェクトの表を出力する場合や、 異なるオブジェクト属性を表す列を

  address_book = [{'name':'N.X.', 'addr':'15 Jones St', 'bonus': 70},
      {'name':'J.P.', 'addr':'1005 5th St', 'bonus': 400},
      {'name':'A.A.', 'addr':'200001 Bdwy', 'bonus': 5},]

  for person in address_book:
    print(f'{person["name"]:8} || {person["addr"]:20} || {person["bonus"]:>5}')

  # N.X.     || 15 Jones St          ||    70
  # J.P.     || 1005 5th St          ||   400
  # A.A.     || 200001 Bdwy          ||     5

文字列 %

Python には、文字列をまとめる古い printf() のような機能もあります。% 演算子は、左側に printf 型の形式文字列(%d int, %s string, %f/%g 浮動小数点数)と、右側に tuple 内の一致する値(タプルはカンマで区切られた値で構成され、通常は括弧内にグループ化)です。

  # % operator
  text = "%d little pigs come out, or I'll %s, and I'll %s, and I'll blow your %s down." % (3, 'huff', 'puff', 'house')

上記の行は長めです。これを別々の行に分割するとします。他の言語のように、「%」の後の行を単純に分けることはできません。Python はデフォルトで各行を個別のステートメントとして扱うためです(プラス面では、これが各行にセミコロンを入力する必要がない理由です)。これを修正するには、式全体を外側のかっこで囲みます。式を複数行に渡せるようになります。この行間分析手法は、以下で詳しく説明する( )、 [ ]、 { } のさまざまなグループ化構造で機能します。

  # Add parentheses to make the long line work:
  text = (
    "%d little pigs come out, or I'll %s, and I'll %s, and I'll blow your %s down."
    % (3, 'huff', 'puff', 'house'))

そのほうがよいですが、線が少し長いです。Python では、行をチャンクに分割し、自動的に連結できます。この行をさらに短くするには、次のようにします。

  # Split the line into chunks, which are concatenated automatically by Python
  text = (
    "%d little pigs come out, "
    "or I'll %s, and I'll %s, "
    "and I'll blow your %s down."
    % (3, 'huff', 'puff', 'house'))

文字列(Unicode とバイトの比較)

通常の Python 文字列は Unicode です。

Python では、次のようなプレーンなバイト(文字列リテラルの前に接頭辞「b」で示される)で構成される文字列もサポートされています。

> byte_string = b'A byte string'
> byte_string
  b'A byte string'

Unicode 文字列はバイト文字列とは異なるタイプのオブジェクトですが、このいずれかのタイプの文字列が渡されると、正規表現などのさまざまなライブラリは正しく機能します。

通常の Python 文字列をバイトに変換するには、文字列に対して encode() メソッドを呼び出します。逆方向に進むと、byte string decode() メソッドは、エンコードされたプレーン バイトを Unicode 文字列に変換します。

> ustring = 'A unicode \u018e string \xf1'
> b = ustring.encode('utf-8')
> b
b'A unicode \xc6\x8e string \xc3\xb1'  ## bytes of utf-8 encoding. Note the b-prefix.
> t = b.decode('utf-8')                ## Convert bytes back to a unicode string
> t == ustring                         ## It's the same as the original, yay!

True

ファイル読み取りのセクションでは、エンコードされたテキスト ファイルを開いて Unicode 文字列を読み取る例があります。

if ステートメント

Python では、if、loops、function などのコードブロックを { } で囲むことはありません。代わりに、Python はコロン(:)とインデント/空白文字を使用してステートメントをグループ化します。if のブール値テストは、かっこで囲む必要はなく(C++/Java との大きな違い)、*elif* 句と *else* 句を含めることができます(ニーモニック: 「elif」という単語は「else」と同じ長さです)。

任意の値を if-test に使用できます。「ゼロ」の値はすべて false としてカウントされます(なし、0、空の文字列、空のリスト、空の辞書)。また、True と False の 2 つの値を持つブール値型もあります(int に変換され、値は 1 と 0)。Python では、通常の比較演算(==、!=、<、<=、>、>=)があります。Java や C とは異なり、== は文字列で正しく動作するようにオーバーロードされています。ブール演算子は、*and*、*or*、*not* のようにスペルアウトされた単語です(Python では C スタイルの && || ! は使用しません)。以下は、一日を通して飲み物のレコメンデーションを提供する健康アプリのコードです。then/else ステートメントの各ブロックが : で始まり、ステートメントがインデントでグループ化されていることに注目してください。

  if time_hour >= 0 and time_hour <= 24:
    print('Suggesting a drink option...')
    if mood == 'sleepy' and time_hour < 10:
      print('coffee')
    elif mood == 'thirsty' or time_hour < 2:
      print('lemonade')
    else:
      print('water')

「:」を省略することは、上記のようなコードを入力する際に最もよく当てはまる構文エラーです。これは、C++/Java を使用する場合と比べて入力すべき追加の要素だからです。また、ブールテストはかっこで囲まないでください。C/Java でよくあることです。コードが短い場合は、次のように「:」の後に同じ行にコードを配置できます(これは関数やループなどにも当てはまります)。ただし、独立した行に配置した方が読みやすいと感じる人もいます。

  if time_hour < 10: print('coffee')
  else: print('water')

演習: string1.py

このセクションの学習を練習するには、基本エクササイズstring1.py の演習を試してください。