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__() メソッドが呼び出され、このメソッドがすべての属性のリストを返すため、一部の属性が欠落している可能性があることに注意してください。また、このメソッドは編集可能またはオーバーライド可能です。
