【Python】文字列の前方一致を判定するstartswithメソッド

2021年11月5日

Pythonで文字列の前方一致を判定するstartswithを紹介します。



startswithメソッド

startswithメソッドで前方一致判定するプログラム

# 前方一致を判定するstartswithメソッド

s = 'abcbcacba'

print(s.startswith('abc')) # True
print(s.startswith('bca')) # False

実行結果

True
False

前方一致を判定するstartswithメソッド

文字列(string型)の前方一致、つまり文字列の先頭が指定した文字列であるかを判定するメソッドがstartswith()メソッドです。

str.startswith(prefix[, start[, end]])

文字列の先頭がprefixで始まればTrueを、そうでなければFalseを返却します。

省略可能なstartが指定されていればそのインデックスの位置から判定を開始します。

省略可能なendが指定されていればそのインデックスの位置で比較を終了します。

なおstartswithとは逆の後方一致、つまり文字列の末尾が指定した文字列であるかを判定するメソッドがendswith()メソッドです。

startswithメソッドで検索開始・終了位置を指定

# startswithメソッド検索開始・終了位置を指定

s = 'abcdefghi'

print(s.startswith('bcd',1))    # True
print(s.startswith('ghi',6))    # True
print(s.startswith('cde',2,5))  # True
print(s.startswith('ab',0,2))   # True

実行結果

True
True
True
True

startの最初のインデックスは0です。省略されている場合は0とみなされます。

一方endのインデックス値には注意でnではなくn + 1としなければなりません。

例えばs[4]の’e’まで検索させたい場合は5をendのパラメータとしなければなりません。

なぜなら検索されるのは指定されたインデックス値の前の要素までであり指定されたインデックス値の要素は含まれないからです。

なので’cde’を先頭要素かどうかを検索する際にendに4を指定するとs[3]の’d’までしか検索されずFalseになります。

startswithメソッドの引数はタプルも可能

startswithメソッドの引数にはタプルも指定できます。

その場合は探索する文字列の先頭がタプルの要素のいずれかの文字列と一致すればTrueを、一致しなければFalseを返却します。

なおタプルではなくリストを引数にするとエラーになります。

startswithメソッドで引数にタプルを指定

# 前方一致を判定するstartswithメソッド(タプルを指定)

s = 'abcdefghi'

print(s.startswith(('abc', 'def', 'ghi'))) # True
print(s.startswith(('rst', 'uvw', 'xyz'))) # False
print(s.startswith(['abc', 'def', 'ghi'])) # TypeError

実行結果

True
False
Traceback (most recent call last):
(中略)
TypeError: startswith first arg must be str or a tuple of str, not list

startswithメソッドの否定形

ある文字列の先頭が指定した文字列でない、つまりstartswith()の否定形はif not文で実現できます。

startswithメソッドの否定形

# startswithメソッドの否定形

s = 'abc'

if not s.startswith('x'):
  print('一致していません。')
else:
  print('一致しています。')

実行結果

一致していません。

大文字小文字に変換するupper()とlower()

今までは小文字のみで判定してきましたがアルファベットには大文字もあります。

例えば’abc’と’ABC’は通常startswithメソッドでは区別されてしまいます。

そこで文字列をすべて大文字または小文字に変換すれば問題は解決できます。

文字列をすべて大文字に変換するのがupper()、小文字に変換するのがlower()です。

upper()とlower()で文字列を統一してstartswithメソッド

# upper()とlower()で文字列を統一して比較

s1 = 'abcdefghi'
s2 = 'ABCDEFGHI'

print(s1.upper().startswith('ABC')) # True
print(s1.upper().startswith('abc')) # False
print(s1.lower().startswith('abc')) # True
print(s1.lower().startswith('ABC')) # False

実行結果

True
False
True
False