Pythonにできることは自動化しよう!【第3回 文字列】

こんにちは、unogram管理人のうのちゅ〜です。

【Pythonにできることは自動化しよう!】シリーズとして、Pythonの基礎から順を追って学習し、作業の自動化・効率化を実現する能力を身に着けていきます。Pythonの基礎について学ぶだけで、大規模なコードを書かなくても十分に役に立つプログラムを記述することができるようになります。Pythonは気になるけど、プログラミングには苦手意識がある方も安心してトライしてみてください!

本シリーズでは、以下のようなことができるようになります。

  • ファイルの読み書き・管理
  • Webサイトからファイルをダウンロード
  • エクセルシート操作
  • PDF・ワード文書操作・テキスト抽出
  • 電子メール・SMS送信

うまく活用すれば作業に役立ちそうなワードがたくさん並んでいますね!

なお、本シリーズでは一部以下の書籍を参考にしています。「退屈なことをPythonにやらせる」ようになるためにはうってつけの書籍なので、ぜひ参考にしてみてください。

それでは見ていきましょう!



Pythonにできることは自動化しよう!【第3回 文字列】

今回はシリーズ第3回として、Pythonの重要なデータ型の1つである文字列の基礎について学習します。

文字列の基礎

これはPythonに限らずどのようなプログラミング言語でも共通することですが、文字列は数値データと並んで最も一般的なデータ型と言えるでしょう。

そんな一般的なデータ型である文字列がPythonにおいてはどのように操作できるか、詳しく見ていきます。

文字列の生成

シングルクォート(‘)、ダブルクォート(“)

Pythonにおいて、文字列はシングルクォート(‘)、あるいはダブルクォート(“)でくくることで書き表されます。

特に文字列がシングルクォートを含む場合は、ダブルクォートを使用して文字列をくくります。

エスケープシーケンス()

エスケープシーケンスとは、特殊な文字を文字列の中に含ませたい場合に使用する記法です。通常、「バックスラッシュ(‘)+1文字」の組み合わせで表現します。例えば、「改行」は「\n」で表すことができます。

エスケープシーケンスを使わずに文字列中にシングルクォートを使用しようとすると、エラーとなりまるので注意しましょう。

例を見ていきます。

print('This is Taro\'s pen')
# This is Taro's pen

print('This is Taro's pen')
# SyntaxError: invalid syntax

print('Good morning.\nGood afternoon.\nGood evening.\n\t\tTaro')
# Good morning.
# Good afternoon.
# Good evening.
# 		Taro

エスケープシーケンスは、この他にもシングルクォート(\’)やダブルクォート(\”)、バックスラッシュ(\)などに使用できます。

raw文字列

シングルクォートなどは文字列をくくるだけでなく、バックスラッシュを組み合わせたエスケープシーケンスによって文字列中に含むことが可能でした。

それでは、バックスラッシュを文字列の一部として扱いたい場合はどうしたら良いのでしょうか?

Pythonではシングルクォート(ダブルクォート)の前に「r」をつけることで、文字列を「raw文字列」として扱うことができます。raw文字列中では、バックスラッシュをそのままバックスラッシュとして扱うことが可能です。

print('\taro')
# 	aro

print(r'\taro')
# \taro

複数行の文字列を扱いたい場合

シングルクォートやダブルクォートを3個連続で文字列の前後にそれぞれ配置することで、複数行の文字列を記述することができます。

エスケープシーケンス\nによって文字列を改行することも可能ですが、3連クォートは改行やタブ、シングルクォートなどをそのまま文字列の一部として扱えるため便利です。

print('''This

is

Taro's pen.''')
# This
# 
# is
# 
# Taro's pen.

上の例では、エスケープシーケンスを含まず、シンプルに記述されている様子がわかるかと思います。

複数行コメント

複数行にわたるコメントをコード内に記述したい場合にも、Pythonではシングルクォートやダブルクォートを3個連続でコメントの前後にそれぞれ配置することで実現できます。



文字列のインデックス操作

文字列も、リストと同様にしてインデックスやスライス操作が可能です。ただし、「」で触れたように、文字列はイミュータブルなので、リストのように代入することはできない点に注意しましょう。

teststring = 'This is a pen.'
print(teststring[2])
print(teststring[10])
print(teststring[3:7])
# i
# p
# s is

文字列でよく使われるメソッド upper()、lower()、join()、split()、strip()

文字列によく使われるメソッドとして、まず、upper()、lower()、join()、split()、strip()を取り上げます。

元の文字列を大文字・小文字に変換した文字列を返すupper()、lower()メソッド

‘文字列.upper()’で元の文字列を全て大文字にした文字列が返され、’文字列.lower()’で元の文字列を全て小文字にした文字列が返されます。

文字列が変数の場合、これらのメソッドを呼び出したことによる元の文字列への変更はありません。

'taro'.upper()
# 'TARO'

newteststring = teststring.lower()
print(newteststring)
# this is a pen.
print(teststring)
# This is a pen.

文字列のリストを連結するjoin()メソッド

‘文字列.join(文字列のリスト)’とすると、リスト中の文字列を連結した文字列を返してくれます。連結される文字列の間には、join()メソッドを呼び出す文字列が挿入されます。例を見てみましょう。

', '.join(['Taro','Jiro','Saburo'])
# 'Taro, Jiro, Saburo'

stringlist = ['This','is','a','pen.']
' '.join(stringlist)
# 'This is a pen.'

print('\n'.join(['Taro','Jiro','Saburo']))
# Taro
# Jiro
# Saburo

'aaa'.join(['A','A','A'])
# 'AaaaAaaaA'

文字列を分割してリストを返すsplit()メソッド

join()メソッドとは逆に、’文字列.split()’とすることで文字列を分割してできた文字列のリストを返すことができます。引数を指定しない場合、スペースやタブなどの空白文字で分割されますが、引数に分割したい文字列を与えることも可能です。

teststring.split()
# ['This', 'is', 'a', 'pen.']

teststring.split('i')
# ['Th', 's ', 's a pen.']

デフォルトでは改行・空白で分割され、返されるリストに空白は含まれません。

tstring.split('i')
# ['Th', 's ', 's a pen.']

teststring2 = '''This

is

Taro's pen.'''
teststring2.split()
# ['This', 'is', "Taro's", 'pen.']

引数に’\n’を指定すると改行位置で分割されるため、リストの中に空の文字列(2行目、4行目に相当)が含まれたり、’Taro’s pen.’が空白で分割されないという違いがあります。

teststring2.split('\n') 
# ['This', '', 'is', '', "Taro's pen."]

文字列の冒頭・末尾の空白文字を削除するstrip()メソッド

‘文字列.strip()’によって、文字列の冒頭・末尾に存在する空白文字を削除した文字列を返すことができます。

また、引数に冒頭・末尾から削除したい文字を指定することで、空白以外の文字列を削除することも可能です。

teststring3 = '   Taro  '
teststring3.strip()
# 'Taro'

teststring4 = 'abccbaTaroabcTaroabcba'
teststring4.strip('abc')
# 'TaroabcTaro'

上の例のように、文字列の冒頭・末尾から、引数に含まれる文字列が存在しなくなるまで削除した文字列が返されていることが分かります。このとき、引数に指定する文字の順序は返す文字列に影響しません。つまり、’abc’でも’bca’でも’cba’でも良いということです。また、Taroの間に挟まれているabcや、Taroの中に含まれるaは削除されません。



文字列の応用編 pyperclip.copy()、pyperclip.paste()

応用編では、基礎から一歩進んだ文字列の扱いについて学習します。参考書の自動化プログラムでも応用されるモジュールやメソッドについて、どのような応用が可能かを含めて紹介していきます。

クリップボードと文字列のやり取りをするpyperclipモジュール

pyperclipモジュールをインポートすると、クリップボードと文字列のやり取りをすることが可能です。Pythonの標準ライブラリには含まれていないので、あらかじめインストールしておく必要があります。Jupyter Notebookの場合は以下のようにしてインストールできます。

%pip install pyperclip

クリップボードのテキストをコピー、ペーストするpyperclip.copy()、pyperclip.paste()関数

インストール後、pyperclipモジュールをインポートすることで、pyperclip.copy()、pyperclip.paste()関数を使用できるようになります。

import pyperclip
pyperclip.copy('This is a pen.')
pyperclip.paste()
# 'This is a pen.'

2行目のpyperclip.copy(‘This is a pen.’)を実行した後に、Ctrl+Vや⌘+Vでペーストすると、’This is a pen.’が表示されます。つまり、クリップボードに’This is a pen.’がコピーされているのです。

また、3行目の実行前に別の文章などをCtrl+Cや⌘+Cでコピーすれば、’This is a pen.’ではなくコピーした文字列がペーストされます。

このように、pyperclipモジュールをうまく使いこなせば、input()関数などを使ってコマンドラインに直接打ち込んだりせず、かつファイルの直接的な読み書きをするよりも簡単に大量のテキストを扱うことができます。

参考書の自動化例

本シリーズで参考にしている「退屈なことはPythonにやらせよう」では、次のような応用例に文字列や関連モジュール・メソッドを利用して、簡単な自動化プログラムを作成しています。詳しい内容についてはぜひ書籍を参照してみてください。

  • パスワード管理プログラムにおける、アカウント名・パスワードのやり取り
  • Wikipediaの記事編集における、膨大なデータの箇条書き化作業の自動化



まとめ

今回は、【Pythonにできることは自動化しよう!】シリーズ第3回として、Pythonの基礎的なデータ型の1つである文字列について学習しました。この先学習するファイル操作などの応用においても必須となる知識なので、しっかり身につけておきましょう。

追加で詳しく学びたいという方は、下記の参考書などを使った学習にも挑戦してみてください。

おすすめ参考書

冒頭でも紹介しましたが、Pythonによる自動化に向けた学習は、本シリーズでも参考にしている次の書籍がおすすめです。「退屈なことをPythonにやらせる」ようになるためにはうってつけの書籍なので、ぜひ参考にしてみてください。