添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
  • https://docs.python.org/ja/3/tutorial/introduction.html#strings

  • Pythonが扱うデータには様々な種類がありますが、 文字列 はいくつかの文字の並びから構成されるデータです。 Pythonは標準で多言語に対応しており、 英語アルファベットだけではなく日本語をはじめとする多くの言語を取り扱えます。

    文字列は、文字の並びをシングルクォート '...' 、もしくはダブルクォート "..." で囲んで記述します。

    以下の例では文字列をそれぞれ、変数 word1 , word2 に代入しています。

    word1 = 'hello'
    word1
    

    上の変数の値が確かに文字列であることは、組み込み関数 type によって確認できます。 type は、任意のデータを引数として、そのデータの種類を返します。 データの種類は、データ型もしくはと呼ばれます。

    type(word1)
    

    str は組み込み関数としても用いられます。 組み込み関数 str を使えば、任意のデータを文字列に変換できます。 一般に、データ型は、そのデータ型への変換を行う関数として用いられることが多いです。

    1-1で学んだ数値を文字列に変換したい場合、次のように行います。

    word3 = str(123)
    word3
    

    複数行にわたる文字列を記述するには、トリプルクォート('''...''' もしくは """...""")を用いることができます。 上記の参考URLを参照してください。 トリプルクォートはコメントとしても用いられます。 なお、1-4 のコーディングスタイルのところで紹介したスタイルガイドのPEP8では、 トリプルクォートには """...""" を使うのが適切と定められています。

    文字列とインデックス

    文字列はいくつかの文字によって構成されています。

    文字列 'hello' の3番目の文字を得たい場合は、以下のような記法を用います。

    'hello'[2]
    

    この括弧内の数値のことをインデックスと呼びます。インデックスは 0 から始まるので、 ある文字列の x 番目の要素を得るには、インデックスとして x-1 を指定する必要があります。

    こうして取得した文字は、Pythonでは長さが 1 の文字列として扱われます。 (プログラミング言語によっては、文字列ではなく別の型のデータとして扱われるものもありますので注意してください。)

    文字列に対して、インデックスを指定してその要素を変更することはできません。(次のセルはエラーとなります) Pythonのデータは、大きく、変更可能なものと変更不可能なものに分類できますが、 文字列は変更不可能なデータです。 したがって、文字列を加工する場合は、新たに別の文字列を作成します。

    [11]:
    
    word1 = 'hello'
    word1[0] = 'H'
    ---------------------------------------------------------------------------
    TypeError                                 Traceback (most recent call last)
    /tmp/ipykernel_1748/1689567903.py in <module>
          1 word1 = 'hello'
    ----> 2 word1[0] = 'H'
    TypeError: 'str' object does not support item assignment
    

    また、文字列の長さ以上のインデックスを指定することはできません。(次はエラーとなります)

    [12]:
    
    word1[100]
    ---------------------------------------------------------------------------
    IndexError                                Traceback (most recent call last)
    /tmp/ipykernel_1748/521024611.py in <module>
    ----> 1 word1[100]
    IndexError: string index out of range
    

    インデックスに負数を指定すると、 文字列を後ろから数えた順序に従って文字列を構成する文字を得ます。 たとえば、文字列の最後の文字を取得するには、-1 を指定します。

    [13]:
    
    word1[-1]
    

    文字列とスライス

    スライスと呼ばれる機能を利用して、文字列の一部(部分文字列)を取得できます。

    具体的には、取得したい部分文字列の先頭の文字のインデックスと最後の文字のインデックスに 1 を加えた値を指定します。 たとえば、ある文字列の2番目の文字から4番目までの文字の部分文字列を得るには次のようにします。

    [14]:
    
    digits1='0123456789'
    digits1[1:4]
    

    スライスでは3番目の値を指定することで、とびとびの文字を指定できます。次のように digits1[3:9:2] と指定すると、インデックス 3 から2文字おきにインデックス 9 より小さい文字を並べた部分文字列を得ます。

    [20]:
    
    digits1[3:9:2]
    

    空文字列

    シングルクォート(もしくはダブルクォート)で、何も囲まない場合、長さ 0 の文字列(空文字列(くうもじれつ)もしくは、空列(くうれつ))となります。 具体的には、下記のように使用します。

    blank = ''
    

    空文字列は、次のように、たとえば文字列中からある部分文字列を取り除くのに使用します。 (replace は後で説明します。)

    [22]:
    
    price = '2,980円'
    price.replace(',', '')
    

    文字列のスライスにおいて、指定したインデックスの範囲に文字列が存在しない場合、 たとえば、最初に指定したインデックス x に対して、 2番目のインデックスの値に x 以下のインデックスの値を指定するとどうなるでしょうか? (ただし、2つのインデックスは同じ符号を持つとし、スライスの3番目の値は用いないとします。) このような場合、結果は次のように空文字列となります(エラーが出たり、結果が None にはならないことに注意してください)。

    [23]:
    
    digits1='0123456789'
    print('空文字列1 = ', digits1[4:2])
    print('空文字列2 = ', digits1[-1:-4])
    print('空文字列3 = ', digits1[3:3])
    print('空文字列ではない = ', digits1[3:-1])
    

    ▲エスケープシーケンス

    文字列を作成するにはシングル ' あるいはダブルクォート " で囲むと説明しました。 これらの文字を含む文字列を作成するには、エスケープシーケンスと呼ばれる特殊な文字列を使う必要があります。

    たとえば、下のように文字列に ' を含む文字列を ' で囲むと文字列の範囲がずれてエラーとなります。

    [29]:
    
    non_escaped = 'This is 'MINE''
    non_escaped
    

    バックスラッシュの表示と入力

    エスケープシーケンスの先頭にある文字は、バックスラッシュ \(Unicode U+005C)です。 これはPythonに限った話ではないですが、バックスラッシュは環境(正確にはフォント)によって見え方が異なります。 Windows上のフォントでは、円記号 ¥ として見えることが多いです。 macOS上のフォントでは、そのままバックスラッシュとして見えることが多いです。

    JIS配列キーボードでは、バックスラッシュキーがないことがあります。 Windows上では、円記号 ¥ キーでバックスラッシュが入力できます。 macOS上では、Alt + ¥ キーでバックスラッシュが入力できます。 ただし、IME設定によっても入力方法は変わるので注意してください。

    [35]:
    
    print('\n') # 改行文字(バックスラッシュ + n)
    print('¥n') # 改行文字でない(円記号 + n)
    print('⧵n') # 改行文字でない(Unicode U+29F5 のバックスラッシュ演算子 + n)
    

    文字列とメソッド

    文字列に対する操作を行うため、様々なメソッド(関数のようなもの)が用意されています。

    メソッドは必要に応じて (...) 内に引数を与え、以下のように使用します。

    文字列.メソッド名(式, ...)
    # あるいは
    文字列変数.メソッド名(式, ...)
    

    文字列には以下のようなメソッドが用意されています。

    replace メソッドは、指定した 部分文字列A を、別に指定した 文字列B で置き換えた文字列を作成します。 この操作では、元の文字列は変化しません。具体的には、次のように使用します。

    文字列.replace(部分文字列A, 文字列B)
    
    [38]:
    
    word1 = 'hello'
    word1.replace('l', '123')
    

    英語の文章からなる文字列 str_engsentences が引数として与えられたとき、str_engsentences 中に含まれる全ての句読点(., ,, :, ;, !, ?)を削除した文字列を返す関数 remove_punctuations を作成してください。 (練習の解答はこのノートブックの一番最後にあります。)

    次のセルの ... のところを書き換えて remove_punctuations(str_engsentences) を作成してください。

    [40]:
    
    def remove_punctuations(str_engsentences):
    

    上のセルで解答を作成した後、以下のセルを実行し、実行結果が True になることを確認してください。

    [41]:
    
    print(remove_punctuations('Quiet, uh, donations, you want me to make a donation to the coast guard youth auxiliary?') == 'Quiet uh donations you want me to make a donation to the coast guard youth auxiliary')
    

    ATGCの4種類の文字から成る文字列 str_atgc が引数として与えられたとき、文字列 str_pair を返す関数 atgc_bppair を作成してください。ただし、str_pair は、str_atgc 中の各文字列に対して、 AT に、TA に、GC に、CG に置き換えたものです。

    次のセルの ... のところを書き換えて atgc_bppair(str_atgc) を作成してください。

    [42]:
    
    def atgc_bppair(str_atgc):
    

    上のセルで解答を作成した後、以下のセルを実行し、実行結果が True になることを確認してください。

    [43]:
    
    print(atgc_bppair('AAGCCCCATGGTAA') == 'TTCGGGGTACCATT')
    

    index メソッドにより、指定した 部分文字列B文字列A のどこに存在するか調べることができます。具体的には、次のように使用します。

    文字列A.index(部分文字列B)
    

    ただし、指定した部分文字列が文字列に複数回含まれる場合、最初のインデックスが返されます。また、指定した部分文字列が文字列に含まれない場合は、エラーとなります。

    [44]:
    
    word1 = 'hello'
    word1.index('lo')
    ---------------------------------------------------------------------------
    ValueError                                Traceback (most recent call last)
    /tmp/ipykernel_1748/1197463809.py in <module>
    ----> 1 word1.index('a')
    ValueError: substring not found
    

    find メソッドも index と同様に部分文字列を検索し、最初に出現するインデックスを返します。

    index との違いは、部分文字列が含まれない場合エラーとはならず -1 が返されることです。

    [47]:
    
    word1 = 'hello'
    word1.find('a')
    

    コロン (:) を1つだけ含む文字列 str1 を引数として与えると、コロンの左右に存在する文字列を入れ替えた文字列を返す関数 swap_colon(str1) を作成してください。

    次のセルの ... のところを書き換えて swap_colon(str1) を作成してください。

    [48]:
    
    def swap_colon(str1):
    

    上のセルで解答を作成した後、以下のセルを実行し、実行結果が True になることを確認してください。

    [49]:
    
    print(swap_colon('hello:world') == 'world:hello')
    

    ATGCの4種類の文字から成る文字列 str_atgc と塩基名(A, T, G, C のいずれか)を指定する文字列 str_bpname が引数として与えられたとき、str_atgc 中に含まれる塩基 str_bpname の数を返す関数 atgc_count を作成してください。

    次のセルの ... のところを書き換えて atgc_count(str_atgc, str_bpname) を作成してください。

    [52]:
    
    def atgc_count(str_atgc, str_bpname):
    

    上のセルで解答を作成した後、以下のセルを実行し、実行結果が True になることを確認してください。

    [53]:
    
    print(atgc_count('AAGCCCCATGGTAA', 'A') == 5)
    

    大文字小文字

    lower, capitalize, upper メソッドを用いると、文字列の中の英文字を小文字に変換したり、大文字に変換したりすることができます。

    これらの操作では、元の文字列は変化しません。

    [54]:
    
    upper_dna = 'DNA'
    upper_dna.lower() # 全ての文字を小文字にする
    

    ▲空白文字の削除

    半角スペース ' '・改行文字 '\n'・タブ文字 '\t'・全角スペース ' ' などを総称して空白文字と呼びます。

    strip メソッドを用いると、文字列の前後にある連続した空白文字を削除した文字列を取得できます。

    [60]:
    
    '  abc\n'.strip()
    

    文字列の大小の比較は、いわゆる辞書式による比較で、文字列の最初の文字から順に比較して大小を決めます。 片方がもう片方を拡張したものであれば、拡張した方を大きいとします。

    [66]:
    
    print('abc' <= 'abc')
    print('abc' < 'abc')
    print('abc' < 'abd')
    print('ab' < 'abc')
    

    英語の文字列 str_engsentences が引数として与えられたとき、それが全て小文字である場合、True を返し、そうでない場合、 False を返す関数 check_lower を作成してください。

    次のセルの ... のところを書き換えて check_lower(str_engsentences) を作成してください。

    [67]:
    
    def check_lower(str_engsentences):
    

    上のセルで解答を作成した後、以下のセルを実行し、実行結果が全て True になることを確認してください。

    [68]:
    
    print(check_lower('down down down') == True)
    print(check_lower('There were doors all round the hall, but they were all locked') == False)
    

    初心者によくある誤解 — 変数文字列の混乱

    初心者によくある誤解として、変数と文字列を混乱する例が見られます。たとえば、文字列を引数に取る次のような関数 func を考えます( func は引数として与えられた文字列を大文字にして返す関数です)。

    [69]:
    
    def func(str1):
        return str1.upper()
    

    ここで変数 str2 を引数として func を呼ぶと、str2 に格納されている文字列が大文字になって返ってきます。

    [70]:
    
    str2 = 'abc'
    func(str2)
    

    次のように func を呼ぶと上とは結果が異なります。次の例では変数 str2 (に格納されている文字列 abc)ではなく、文字列 'str2' を引数として func を呼び出しています。

    [71]: