こんにちは! プログラマーのakiraです。
みなさんの中には、
・ 文字列操作の基本はわかったのでもう少し応用的なことを学びたい!
・ Pythonの基本はもうわかったので、もっと実践的な使い方を教えて欲しい!
と思っている方も多いのではないでしょうか?
本記事は、以下の【Python入門】文字列操作の基本をわかりやすく解説!の応用編となり、文字列操作の応用的な使い方に重点をおいて解説していますので、しっかりマスターして行ってください!!
本記事を読む前に、Pythonがどんなプログラミング言語なのかをおさらいしておきたい人は次の記事を参考にしてください。
→ Pythonとは?特徴やできること、活用例をわかりやすく簡単に解説
なお、その他のPythonの記事についてはこちらにまとめています。
文字列操作の基本
本記事では、応用的な内容をご紹介していますので、Pythonの文字列操作について基本からやりなおしたい!という方は、本記事の前編であるこちらの記事を確認してください!
色々な文字列操作をしてみよう!
スライスで文字列を抽出してみよう!
スライスとは、Pythonの文字列で範囲を指定して文字列を切り出すことができる機能になります。
スライスがわからない方やスライスについてより詳しく知りたい方は、以下の記事を参考にしてください!
splitで文字列を分割する
splitは、Pythonの文字列操作で非常によく使用する文字列メソッドになります。
文字列を指定した区切り文字で分割して、リストで返してくれるためとても便利です!
文字列操作の応用の内容でも扱いますので、基本的な使い方はこちらの記事でしっかりと確認しておいてください!
replaceで文字列を置換、削除する
replaceも先程紹介しましたsplitと同様に、文字列操作で非常によく使用するメソッドです。
特定の文字列を指定した文字列へ置換することができます!
replaceは、文字列の置換にも使用することができますが、置換に指定する文字列を空にすると特定の文字列の削除に使用することもできますので、文字列操作の基本として是非覚えておきたい機能です!
詳しいreplaceの使い方については、以下の記事が大変参考になります。
正規表現で文字列を抽出してみよう!
文字列操作の基本として覚えておきたいものとして、正規表現があります。
正規表現を完璧に使いこなすのはとても経験が必要になるため、プログラミングを始めた頃は極端に難しく感じるかもしれないですが、まず基本的なことだけ覚えて使えるようになるだけで十分です!
正規表現の基本的な使い方を覚えるだけで文字列操作のほとんどが可能となります!
以下の記事では、正規表現とは?から正規表現の具体的な使い方まで解説してくれてますので確認してみてください!
特定のパターンにマッチする文字列を抽出しよう!
それでは、正規表現のライブラリであるreを使ってパターンにマッチする文字列を抽出してみましょう!
「名前,電話番号」の形式で入っているリストから順番に取り出し、re.matchを使用して条件に一致している電話番号の人の名前を表示しています。
import re name_phone_list = [ 'James,070-0000-1111', 'Mary,070-0000-1111', 'John,070-0000-2222', 'Patricia,070-0000-2222', ] for row in name_phone_list: columns = row.split(',') name = columns[0] phone = columns[1] if re.match('070-0000-2222', phone): print(name)
実行結果
John Patricia
実は、name_phone_listのデータが上記のようであれば結果に問題はないのですが、特定のデータが入ると、正しく抽出できないといったバグの原因にもなるため注意が必要です。
次の項で詳しく見ていきましょう!
パターンマッチ判定時の注意点
それでは、リストname_phone_listにテストデータとして‘test,070-0000-222222222222222222222’,を追加し、Pythonを実行してみてください。
import re name_phone_list = [ 'James,070-0000-1111', 'Mary,070-0000-1111', 'John,070-0000-2222', 'Patricia,070-0000-2222', # testを追加した 'test,070-0000-222222222222222222222', ] for row in name_phone_list: columns = row.split(',') name = columns[0] phone = columns[1] if re.match('070-0000-2222', phone): print(name)
実行結果
John Patricia test
実行していただくと確認できるかと思いますが、電話番号が070-0000-222222222222222222222のようなおかしなデータまでも一致してしまっているのです!
このように、正規表現は文字列操作において強力な反面、しっかりと考慮して使用しないと、見落としがバグに繋がるケースもありますので、条件として問題ないかよく検討して使用してください!!
今回のケースのみ考慮するのであれば、17行目を以下のように変更することで対処できます。
※電話番号の末尾に「行の終わりのマッチ」を意味する「$」つけてください!
if re.match('070-0000-2222
正規表現reとは、表現にマッチするかを検査できるものになります。
reの詳しい使用方法については以下記事にも掲載されています。
文字列を抽出の応用
文字列操作を組み合わせて特定の文字列を抽出してみよう!
それでは文字列操作の基本で学んだスライスやメソッドを組み合わせて、少し複雑な文字列操作をやってみましょう!!
変数wordsに末尾が「tion」で終わる英単語とそうでない英単語を半角スペースで区切って代入しています。
このwordsに代入された英単語から「tion」を含む物を取り出し、出力する際には「tion」を削除して結果を表示してみましょう!
words = "question dog negotiation information cat happy" for word in words.split(): s = word.find("tion") if s > 0: print(word[:s])
実行結果
ques negotia informa
どうでしたか?少し複雑になってきたので、要点をじっくり解説していきます!
まず3行目で、wordsに代入された複数の英単語をスペース区切りでsplitして、英単語一つずつに分割しリスト化しています。
for文でこのリストから英単語を一つずつ取り出してword変数に格納し、判定から抽出、表示までの処理を行っていきます。
4行目で、findメソッドを使用して「tion」が含まれているかを判定しています。
指定した文字列が含まれている場合は、見つけた文字列の位置を返します。
最後にif文で判定を行い、文字列のスライスで「tion」を除いた文字列を表示しています!
文字列の間に特定の区切り文字をつける!
ある文字列の間に、区切り文字を入れたくなる時ってありませんか?
そんな時は以下のように、joinを使用して連結しちゃいましょう!
joinとは、指定した区切り文字で結合する時に使う便利なメソッドなのです!
「Pythonのjoinって何!?」って方は以下の記事に基礎から詳しく解説されていました!!
また文字列の受け渡しは、高階関数mapを使用して行っています!!
もちろんfor文を使用して行っても問題ないのですが、関数strを引数として渡すことができるため便利です。
今後のサンプルコードはこのmapを使って解説していきます!
以下に例を掲載していますので、比較してみてください!
mapの例
n_list = [111, 222, 333, 444, 555] result = '|'.join(map(str, n_list)) print(result)
forの例
n_list = [111, 222, 333, 444, 555] for k, i in enumerate(n_list): n_list[k] = str(i) result = '|'.join(n_list) print(result)
実行結果
111|222|333|444|555
高階関数mapは、関数を受け取って処理をすることができる関数になります。
mapを基礎から復習したい方、より多くのパターンを確認したい方は以下の記事に詳しく解説されています!!
区切り文字の入った文字列を分割して数値リストにする!
次は1〜50までの数字がカンマで区切られていて、それが文字列として変数num_listに格納されている場合を考えてみましょう!!
大抵num_listがこの形式だと、とても扱いにくいため、扱いやすい形に変換したいと考えますが、ここではPythonのリストに変換していきます。
またリストに格納する際は、文字列から数値に変換したいと思います。
それでは、サンプルコードを見ていきましょう!
先程と同様にmapを使用しています。
mapの使い方は先程と同じですね!
もしmapの操作が理解できない場合は、一個前のサンプルに戻ってmapの使い方について確認してみてくださいね!
num_list = '1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50' result = list(map(int, num_list.split(','))) print(result)
実行結果
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50]
ちなみに、3行目をsplitを使用して、「result = num_list.split(‘,’)」とすると、これでもリストに変換はできるのですが、文字列になってしまうのです!!
リスト内の数値を文字列にして連結する!
次は、前回まで学習してきた文字列操作の逆バージョンになります。
やっていることは、mapでの操作なので同じです。
リストから数値を取り出してから文字列に変換し、カンマで連結しています。
最終的には文字列として取得できるので、たまに変換したい時にさっと行えると便利です。
num_list = [11, 12, 13, 14, 15, 16, 17, 18, 19, 20] res = ",".join(map(str, num_list)) print(res)
実行結果
11,12,13,14,15,16,17,18,19,20
正規表現と関数で複雑な文字列操作に挑戦する!
次は、今まで学習してきたことのまとめとして
・正規表現でより複雑な文字列操作に挑戦する!
・map関数に渡す関数を自作して、より柔軟に文字列操作を行えるようにする!
に挑戦していきましょう!
以下のサンプルコードを確認してください!
phone_listには、複数の電話番号がリスト形式で格納されています。
check_format関数内の正規表現「re.split」で、半角スペースや「/」「-」に一致したものを分割しています。
また正しく電話番号の形式に分割できたものは、電話番号の末尾4桁を表示しています。
import re phone_list = [ # 正しい形式 "070-9090-1111", # 正しくない形式 "07000909022222222", # 正しくない形式 "070,9090,3333", # 正しくない形式 "0709090,4444", # 正しい形式 "070/9090/5555", # 正しくない形式 "070*9090*66666", # 正しい形式 "070 9090 7777", ] def check_format(char): list = re.split("[/ -]", char) if len(list) == 3: return int(list[-1]) result = list(map(check_format, phone_list)) print(result)
実行結果
[1111, None, None, None, 5555, None, 7777]
実行した結果は、電話番号の末尾4桁「1111」「5555」「7777」が出力されていますので、正しい電話番号を判定して、目的の値を得ることができました!
まとめ
いかがでしたでしょうか。
今回は、Pythonの文字列操作の応用について学習しました!
応用編では主に、mapを使った方法や正規表現での文字列操作をご紹介しました。
また最後の項では、mapに使用する関数を自作して使用できることも学習しましたね!
文字列操作というと、文字列メソッド単体の使い方の紹介など基本的なものが多いですが
実際の業務で使用する場合や組み合わせて使用する場合などは色々と工夫が必要で実は奥が深いものです。
まずは本記事で紹介した応用編を確実に理解して、文字列操作をしっかりとマスターしていきましょう!!
, phone):
正規表現reとは、表現にマッチするかを検査できるものになります。
reの詳しい使用方法については以下記事にも掲載されています。
文字列を抽出の応用
文字列操作を組み合わせて特定の文字列を抽出してみよう!
それでは文字列操作の基本で学んだスライスやメソッドを組み合わせて、少し複雑な文字列操作をやってみましょう!!
変数wordsに末尾が「tion」で終わる英単語とそうでない英単語を半角スペースで区切って代入しています。
このwordsに代入された英単語から「tion」を含む物を取り出し、出力する際には「tion」を削除して結果を表示してみましょう!
実行結果
どうでしたか?少し複雑になってきたので、要点をじっくり解説していきます!
まず3行目で、wordsに代入された複数の英単語をスペース区切りでsplitして、英単語一つずつに分割しリスト化しています。
for文でこのリストから英単語を一つずつ取り出してword変数に格納し、判定から抽出、表示までの処理を行っていきます。
4行目で、findメソッドを使用して「tion」が含まれているかを判定しています。
指定した文字列が含まれている場合は、見つけた文字列の位置を返します。
最後にif文で判定を行い、文字列のスライスで「tion」を除いた文字列を表示しています!
文字列の間に特定の区切り文字をつける!
ある文字列の間に、区切り文字を入れたくなる時ってありませんか?
そんな時は以下のように、joinを使用して連結しちゃいましょう!
joinとは、指定した区切り文字で結合する時に使う便利なメソッドなのです!
「Pythonのjoinって何!?」って方は以下の記事に基礎から詳しく解説されていました!!
また文字列の受け渡しは、高階関数mapを使用して行っています!!
もちろんfor文を使用して行っても問題ないのですが、関数strを引数として渡すことができるため便利です。
今後のサンプルコードはこのmapを使って解説していきます!
以下に例を掲載していますので、比較してみてください!
mapの例
forの例
実行結果
高階関数mapは、関数を受け取って処理をすることができる関数になります。
mapを基礎から復習したい方、より多くのパターンを確認したい方は以下の記事に詳しく解説されています!!
区切り文字の入った文字列を分割して数値リストにする!
次は1〜50までの数字がカンマで区切られていて、それが文字列として変数num_listに格納されている場合を考えてみましょう!!
大抵num_listがこの形式だと、とても扱いにくいため、扱いやすい形に変換したいと考えますが、ここではPythonのリストに変換していきます。
またリストに格納する際は、文字列から数値に変換したいと思います。
それでは、サンプルコードを見ていきましょう!
先程と同様にmapを使用しています。
mapの使い方は先程と同じですね!
もしmapの操作が理解できない場合は、一個前のサンプルに戻ってmapの使い方について確認してみてくださいね!
実行結果
ちなみに、3行目をsplitを使用して、「result = num_list.split(‘,’)」とすると、これでもリストに変換はできるのですが、文字列になってしまうのです!!
リスト内の数値を文字列にして連結する!
次は、前回まで学習してきた文字列操作の逆バージョンになります。
やっていることは、mapでの操作なので同じです。
リストから数値を取り出してから文字列に変換し、カンマで連結しています。
最終的には文字列として取得できるので、たまに変換したい時にさっと行えると便利です。
実行結果
正規表現と関数で複雑な文字列操作に挑戦する!
次は、今まで学習してきたことのまとめとして
・正規表現でより複雑な文字列操作に挑戦する!
・map関数に渡す関数を自作して、より柔軟に文字列操作を行えるようにする!
に挑戦していきましょう!
以下のサンプルコードを確認してください!
phone_listには、複数の電話番号がリスト形式で格納されています。
check_format関数内の正規表現「re.split」で、半角スペースや「/」「-」に一致したものを分割しています。
また正しく電話番号の形式に分割できたものは、電話番号の末尾4桁を表示しています。
実行結果
実行した結果は、電話番号の末尾4桁「1111」「5555」「7777」が出力されていますので、正しい電話番号を判定して、目的の値を得ることができました!
まとめ
いかがでしたでしょうか。
今回は、Pythonの文字列操作の応用について学習しました!
応用編では主に、mapを使った方法や正規表現での文字列操作をご紹介しました。
また最後の項では、mapに使用する関数を自作して使用できることも学習しましたね!
文字列操作というと、文字列メソッド単体の使い方の紹介など基本的なものが多いですが
実際の業務で使用する場合や組み合わせて使用する場合などは色々と工夫が必要で実は奥が深いものです。
まずは本記事で紹介した応用編を確実に理解して、文字列操作をしっかりとマスターしていきましょう!!