Python の文字列から部分文字列を抽出する
文字列は文字のシーケンスです。ソフトウェア開発であろうと競技プログラミングであろうと、私たちは常に文字列を扱います。プログラムの作成中に、文字列のサブパートにアクセスする必要がある場合があります。これらのサブパーツは、より一般的にはサブストリングとして知られています。サブストリングは、ストリングのサブセットです。
Python では、文字列のスライスを使用するか、正規表現または正規表現を使用して、このタスクを簡単に実行できます。
Python で文字列スライスを使用して部分文字列を抽出する
Python で文字列スライスを行う方法はいくつかあります。インデックス作成は、最も基本的で最も一般的に使用される方法です。次のコードを参照してください。
myString = "Mississippi"
print(myString[:]) # Line 1
print(myString[4:]) # Line 2
print(myString[:8]) # Line 3
print(myString[2:7]) # Line 4
print(myString[4:-1]) # Line 5
print(myString[-6:-1]) # Line 6
出力:
Mississippi
issippi
Mississi
ssiss
issipp
ssipp
上記のコードでは、文字列を格納する変数の最後に []
角かっこを追加します。この表記をインデックス作成に使用します。これらの括弧内に、インデックスを表す整数値をいくつか追加します。
これは、角かっこ [start : stop : step]
の形式です(コロン(:
)で区切られます)。
デフォルトでは、start
の値は 0
または最初のインデックスであり、stop
の値は最後のインデックスであり、step
の値は 1
です。start
はサブストリングの開始インデックスを表し、stop
はサブストリングの終了インデックスを表し、step
は各インデックスの後にインクリメントするために使用する値を表します。
Python ではインデックスが 0
から始まるため、返されるサブストリングは実際には start
インデックスと stop - 1
インデックスの間にあります。したがって、Missippi
から Miss
を取得したい場合には、[0 : 4]
を使用する必要があります。
角かっこを空にすることはできません。デフォルト値を使用する場合は、必要な数のコロン:
を間にスペースを入れて追加し、参照するパラメーターを指定する必要があります。理解を深めるには、次のリストを参照してください。
[:]
-> 文字列全体を返します。[4 : ]
-> インデックス4
から最後のインデックスまでの部分文字列を返します。[ : 8]
-> インデックス0
からインデックス7
までの部分文字列を返します。[2 : 7]
-> インデックス2
からインデックス6
までの部分文字列を返します。[4 : -1]
-> インデックス4
から最後から 2 番目のインデックスまでの部分文字列を返します。-1
は、Python で最後のインデックスを定義するために使用できます。[-6 : -1]
-> 最後から 2 番目のインデックスまでの 6 番目のインデックスから始まる部分文字列を返します。
Python で slice()
コンストラクターを使用して部分文字列を抽出する
角かっこ内のインデックスに言及する代わりに、slice()
コンストラクターを使用して slice
オブジェクトを作成し、文字列またはリストやタプルなどの他のシーケンスをスライスできます。
slice(start, stop, step)
コンストラクターは、start
、stop
、および step
の 3つのパラメーターを受け入れます。それらは上で説明したのとまったく同じ意味です。
スライス
の動作は、角かっこ表記とは少し異なります。スライスオブジェクトは、この myString[<'slice' object>]
のように文字列変数ブラケット内に配置されます。
単一の整数値、たとえば x
が slice()
コンストラクターに提供され、さらにインデックススライスに使用される場合、インデックス 0
からインデックス x - 1
までの部分文字列が取得されます。次のコードを参照してください。
myString = "Mississippi"
slice1 = slice(3)
slice2 = slice(4)
slice3 = slice(0, 8)
slice4 = slice(2, 7)
slice5 = slice(4, -1)
slice6 = slice(-6, -1)
print(myString[slice1])
print(myString[slice2])
print(myString[slice3])
print(myString[slice4])
print(myString[slice5])
print(myString[slice6])
出力:
Mis
Miss
Mississi
ssiss
issipp
ssipp
受信した出力は自明です。インデックスは、角かっこ表記で定義されているのと同じ規則に従います。
Python で正規表現を使用して部分文字列を抽出する
正規表現には、Python の組み込みパッケージ re
を使用します。
import re
string = "123AAAMississippiZZZ123"
try:
found = re.search("AAA(.+?)ZZZ", string).group(1)
print(found)
except AttributeError:
pass
出力:
Mississippi
上記のコードでは、search()
関数は、渡された文字列の引数として指定されたパターンの最初の場所を検索します。Match
オブジェクトを返します。Match
オブジェクトには、サブストリングの span
やサブストリングの開始インデックスと終了インデックスなど、出力を定義する多くの属性があります。
print(dir(re.search('AAA(.+?)ZZZ', string)))
は、Match
オブジェクトのすべての属性を出力します。dir()
を使用すると、__dir__()
メソッドが呼び出され、このメソッドがすべての属性のリストを返すため、一部の属性が欠落している可能性があることに注意してください。また、このメソッドは編集可能またはオーバーライド可能です。