Pythonで先頭の文字の一致を調べるstartswith、末尾の文字の一致を調べるendswithで複数の条件で検討する方法

  • URLをコピーしました!
目次

startswith、endswith

今まで何度か使ってきたのですが、まだ解説をしていなかった「startswith」と「endswith」。

使い勝手がいいために思いの外多用しているのですが、先頭の文字や末尾の文字を複数確認できたらなとずっと思っていました。

そんな悩みを抱えながらでも使っていたのですが、どうしても複数の条件を一括で調べなければいけない場面が出てきたたので、どうやったらいいか調べてみたというのが今回のお話です。

とりあえずは「startswith」と「endswith」の使い方の基本から始めていきましょう。

文字の検索:in

とその前に比較のために文字の検索の仕方をおさらいです。

多分一番使っているのは「’検索する文字’ in ‘検索対象文字列’」ではないでしょうか。

例えばこんな感じ。

word = 'start_middle_end'

print('start' in word)

実行結果
True

「start」がword(つまりstart_middle_end)の中に存在しているため「True」となりました。

もちろん「end」を検索する文字列にすれば、wordの最後に「end」があるため「True」になります。

word = 'start_middle_end'

print('end' in word)

実行結果
True

少し脱線しますが、リストの中に同じ「文字列」が存在するか確認するためにも「in」は使えます。

words = ['start', 'middle', 'end']

print('middle' in words)

実行結果
True

ただし検索対象がリストの場合はリストの中の文字列に検索対象の「文字」が存在するかではなく、同じ文字列がリストの中にあるかどうかの確認になることに注意してください。

ということでこのようにリスト内の文字列の中に特定の文字が存在するかは確認できません。

words = ['start', 'middle', 'end']

print('m' in words)

実行結果
False

話を戻しましょう。

「’検索する文字’ in ‘ 検索対象文字列’」で検索対象の文字列の中に特定の文字列があるかどうかを調べることができるのですが、このコマンドでは「文字列中のどこに存在しているか」までは確認できません。

そこで役立つのが「startswith」や「endswith」なのです。

startswith、endswith

「startswith」は文字列の先頭に特定の文字列が存在するか、また「endswith」は文字列の末尾に特定の文字列が存在するかを確認できます。

使い方はそれぞれ「’検索対象文字列’.startswith(‘検索する文字列’)」、「’検索対象文字列’.endswith(‘検索する文字列’)」です。

一致すれば「True」、一致しなければ「False」が返されます。

word = 'start_middle_end'

print(word.startswith('start'))
print(word.endswith('end'))

print(word.startswith('middle'))
print(word.endswith('middle'))

実行結果
True
True
False
False

「startswith」はファイル名の先頭に同じ文字列を付けて分類してある場合(日付とか内容とか)に、「endswith」はファイルを拡張子で一括取得するのに便利です。

例えばこんな感じ。

files = ['test1.csv', 'test2.csv', 'test3.csv',\
         'test1.txt', 'test2.txt', 'test3.txt',\
         'test1.log', 'test2.log', 'test3.log']

print('For startswith')

for file in files:
    if file.startswith('test1') == True:
        print(file)

print('For endswith')

for file in files:
    if file.endswith('csv') == True:
        print(file)

実行結果
For startswith
test1.csv
test1.txt
test1.log
For endswith
test1.csv
test2.csv
test3.csv

という感じでなかなか便利なのですが、例えば上の例で「test1とtest2」を一度に取得したかったり、「.csvと.txt」を一度に取得したいなんて場面もあるわけです。

複数条件にはタプル

で、どうするかというと複数条件を調べる際には「タプル」を使います。

ということでこんな感じ。

start_tupple = ('test1', 'test2')

end_tupple = ('.csv', '.txt')

files = ['test1.csv', 'test2.csv', 'test3.csv',\
         'test1.txt', 'test2.txt', 'test3.txt',\
         'test1.log', 'test2.log', 'test3.log']

print('For startswith')

for file in files:
    if file.startswith(start_tupple) == True:
        print(file)
        
print('For endswith')

for file in files:
    if file.endswith(end_tupple) == True:
        print(file)

実行結果
For startswith
test1.csv
test2.csv
test1.txt
test2.txt
test1.log
test2.log
For endswith
test1.csv
test2.csv
test3.csv
test1.txt
test2.txt
test3.txt

確かに「startswith」で「test1」と「test2」で始まるファイル、「endswith」で「.csv」と「.txt」で終わるファイルが取得できています。

普段タプルを使うことがほとんどないので、結構新鮮でした。

できない例その1:in」ではタプルでの複数条件検索はできない

同じようにして「in」でもタプルを使って複数の条件で検索できるのかと思って、やってみたのですがダメでした。

ext = ('t1.', 't2.')

files = ['test1.csv', 'test2.csv', 'test3.csv',\
         'test1.txt', 'test2.txt', 'test3.txt',\
         'test1.log', 'test2.log', 'test3.log']

for file in files:
    if ext in file:
        print(file)

実行結果
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
/var/folders/sp/hg7p80kx22s7vct7yb0zl5cm0000gn/T/ipykernel_34603/369783817.py in <module>
      6 
      7 for file in files:
----> 8     if ext in file:
      9         print(file)

TypeError: 'in <string>' requires string as left operand, not tuple

できない例その2:リストを使って複数条件検索

タプルで複数の条件を検索できるなら、リストを使ってもできるんじゃないかと思ってやってみたのですが、ダメでした。

ext = ['.csv', '.txt']

files = ['test1.csv', 'test2.csv', 'test3.csv',\
         'test1.txt', 'test2.txt', 'test3.txt',\
         'test1.log', 'test2.log', 'test3.log']

for file in files:
    if file.endswith(ext) == True:
        print(file)

実行結果
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
/var/folders/sp/hg7p80kx22s7vct7yb0zl5cm0000gn/T/ipykernel_34603/3216606653.py in <module>
      6 
      7 for file in files:
----> 8     if file.endswith(ext) == True:
      9         print(file)

TypeError: endswith first arg must be str or a tuple of str, not list

ここら辺がちゃんと基礎を体形的に学んでいないために理解できていないところなんだなと思います。

よく間違える例:startwith、endwith

よくやる間違えとしては、真ん中の「s」を忘れることでしょう。

つまり「startswith」、「endswith」が正しいのに「startwith」、「endwith」としてしまうということです。

もちろんエラーになります。

word = 'start_middle_end'

print(word.startwith('start'))

実行結果
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
/var/folders/sp/hg7p80kx22s7vct7yb0zl5cm0000gn/T/ipykernel_34603/2318482334.py in <module>
      1 word = 'start_middle_end'
      2 
----> 3 print(word.startwith('start'))

AttributeError: 'str' object has no attribute 'startwith'
word = 'start_middle_end'

print(word.endwith('end'))

実行結果
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
/var/folders/sp/hg7p80kx22s7vct7yb0zl5cm0000gn/T/ipykernel_34603/2437789961.py in <module>
      1 word = 'start_middle_end'
      2 
----> 3 print(word.endwith('end'))

AttributeError: 'str' object has no attribute 'endwith'

ということでなかなか便利な「startswith」と「endswith」。

タプルを使うことで複数の条件が検索できるようになったことから、どんどん活躍の場が増えそうです。

ではでは今回はこんな感じで。

よかったらシェアしてね!
  • URLをコピーしました!

コメント

コメントする

目次
閉じる