『退屈なことはPythonにやらせよう』その4 (6章:文字列操作)

Python初心者です。

『退屈なことはPythonにやらせよう』を走っています。

4回目の今回は、6章をやっていきます~。

前回の記事はこちら↓


今回の目次

今回は、Pythonで文字列をばちばちいじっていくための方法を学びます~。


Pythonでの文字列の操作

基本の文字列操作では以下のことが重要になります

  • 文字列リテラル
  • インデックスとスライス
  • inとnot in 演算子

では順番にみていきます。

文字列リテラル

Pythonにおける文字列は

  • ‘ (シングルクォート)
  • ” (ダブルクォート)
  • エスケープ文字

などを利用して表されます。

『退屈なことはPythonにやらせよう』のコードでは、基本的にシングルクォートが使われています。

ただ、Shiftキーを押したときの押しやすさの関係で、僕はダブルクォートを使いがちです。

なおしたほうが良いんでしょうか…?

それはそうと、シングルクォートだと、所有格のsやら I’m などの省略を表すアポストロフィが書けなくなってしまいます

そんなときには

  • ダブルクォートで文字列を囲う
  • エスケープ文字を使う

という選択肢があります。

ダブルクォートも引用などを表す時に使ったりするので、文字列中で使うときにはきちんとエスケープ文字を使うのがいいのかなと思います。

エスケープ文字はバックスラッシュで書きます。(バックスラッシュはエンターキーの上のところにあります。)

>>> print("neko\'s kitchen\"")
#出力 neko's kitchen"

また、エスケープ文字には他にも種類があり、

  • タブ
  • 改行
  • バックスラッシュ

などを打つことができます。

print("neko's kitchen\tpart2\nepisode\tof\ttsuna\\kan") 
#neko's kitchen  part2
#episode of      tsuna\kan

結果も、きちんと改行されて出てきます。

raw文字

クォート文字の前に r をつけると、raw文字となります。

バックスラッシュなどもすべて無視して文字列として表示されます。

三連クォート

シングルクォートかダブルクォートを ”’ や “”” のように使うと、複数行に渡る文字列認識をさせることができます。

改行やスペースもそのままprint関数などに認識されます。

また、1行以上のコメントを付けるときにも三連クォートが利用されたりします。

"""
ここは文字列として認識される。
日本語が書いてあっても大丈夫。

print関数などに渡せば、このまま出力される。
"""

インデックスとスライス

文字列も、リストのようにインデックス番号を用いてスライスすることができます。

インデックスの振られ方は、クォートの後すぐにが0です。スペースや感嘆符も含みます。

文字列[インデックス番号]のような形で指定することができます。

スライスには文字列[0:6]のような形で [ ] の中に、

始めの番号 : 終わりの番号という形で表します。(マイナスもいけます。)

inとnot in 演算子

inとnot inの演算子を使って、文字列の中に特定の文字列があるかを判定することができます。

評価すると、ある(True) か ない(False)が返ってきます。

"cats" in "kitty"          
#出力 False

>>> "cats" not in "kitty" 
#出力 True


Pythonの文字列メソッド

大文字・小文字にするメソッド(upper, lower)

文字列のあとにupperまたはlowerを付けることで、全てを大文字、もしくはすべてを小文字にすることができます。

print("cat".upper())
#出力 CAT

print("cAt".lower()) 
#出力 cat

upperとlowerを付けるだけだと、「変えました!」という風になるだけなので、結果を表示したい場合はprint関数などを使います。また、変数などに入っている場合は変数の中身が変更されないので、引き続き使うばあいは変数に代入します。

neko = "cats"
neko = neko.upper()

のような形にします。

「is~」で、文字列の中にあるかないか判定するメソッド

文字列.is~ として、あるかないか判定をします。TrueかFalseが返ってきます。

使いかたは全て共通で、「文字列.is~()」のように、文字列の後ろに付けます。

  • isupper (アルファベットがすべて大文字)
  • islower (アルファベットがすべて小文字)
  • isalpha (アルファベットだけかどうか)
  • isalnum (数字とアルファベット混合のものかどうか)
  • isdecimal (数字だけの文字列かどうか)
  • isspace (スペースかタブか改行だけで構成される文字列)
  • istitle (一文字目が大文字で、のこりが全て小文字)

全て使う位置は同じです。

"neko".isupper()
# False
"neko".islower()
# True
"neko".isalpha()
# True
"neko".isalnum()
# True
"neko".isdecimal()
# False
"neko".isspace()
# False
"neko".istitle()
# False

リストと文字列の橋渡し(join、split)

join()はリストの要素を一つの文字列に結合するメソッドです。

使い方としては

“区切りにいれる文字列”.join(リスト)

という感じになります。

区切りにいれる文字列はカンマ( , )や半角スペースになるでしょうか。

split()メソッドはjoinの逆です。文字列を、任意の文字で区切ってリストにすることができます。

“文字列”.split(区切りたい文字)

という感じで使います。

右揃え、左揃え、中央揃え (rjust, ljust, center)

ワープロソフトでよくある、右端っこを合わせるか、左に合わせるか、はたまた中央をそろえるか、というのが出来るメソッドです。

“文字列”.rjust(文字数, “隙間にいれる文字”)という感じで使います。

ljust()もcenterも、書き方は同じです。

"neko".rjust(10, "*") 
#'******neko'

"neko".ljust(10, "*") 
#'neko******'

"neko".center(10, "-") 
#'---neko---'

隙間に入れる文字は空欄にして欲しい文字数だけを渡しても大丈夫です。スペースで間を埋めてくれます。

空白除去のstrip

文字列の前後の空白を削除してくれるのがstrip()メソッドです。

使い方としては

文字列.strip()

または

文字列.strip(“除きたい文字列”)

となります。

右側だけ、左側だけ、というのにそれぞれ rstrip() とlstrip()もあります。

除きたい文字列では順番が関係ありません。大文字と小文字は分かれています。

"aaaaaaaacataaaaaaaaa".strip("a") 
# 'cat'

"aaaaaaaacataaaaaaaaa".strip("A")
# 'aaaaaaaacataaaaaaaaa'

catの c と t に挟まれている a は無くならず、前後の a だけ無くなります。

また、除く文字に大文字のAを指定すると、小文字の a は消えません。

おまけで、コピー&ペーストを行うpyperclipモジュール

コピペを実装するサードパーティ製のモジュールが

pyperclip

です。

普通にimportしても使えない場合は、コマンドプロンプト(Win)やターミナル(Mac)などで、pip install みたいなのをする必要があります。

  • pyperclip.copy(“クリップボードにコピーしたいもの”)
  • pyperclip.paste()

クリップボードは、言ってしまえば、ペーストで張り付けられる領域という感じです。


文字列操作の演習プロジェクト

表の表示

今回のプロジェクトでは行列として与えられたデータを、文字の端っこをそろえて綺麗に表示するコードを書きました。

結果は以下の通り。

table_data = [["apples", "orange", "cherries", "banana"],
             ["Alice", "Bob", "Carol", "David"],
             ["dogs", "cats", "moose", "goose"]]

def print_table(table):
    col_number = len(table)
    row_number = len(table[0])
    
    col_width = [0] * col_number
    for i in range(col_number):
        for word in table[i]:
            if col_width[i] < len(word):
                col_width[i] = len(word)
    
    for i in range(row_number):    
        for j in range(col_number):
            print(table[j][i].rjust(col_width[j]), end=" ")
        print()

print_table(table_data)

"""
出力は以下

  apples Alice  dogs
  orange   Bob  cats
cherries Carol moose
  banana David goose
"""

流れとしては、一番長い文字列の長さ(整数値)をそれぞれの列ごとに取得、順番に表示する、という感じです。

print関数は終わりを指定しないと改行されてしますので、end = ” “としました。

また、結果の最初の行が終わってから改行するために、一行表示が終わったら一度print()をいれる感じにしました。

思考錯誤で何回も表示させながら、なんとか課題通りに出力できました。


まとめ

今回はけっこうてこずってしまいました。

というのも、.batファイルというのを作るところがあったのですが、@py.exeがありませんよ~というエラーが出てきてしまったのです。そこで止まってしまいました。

結果として、PythonをMicrosoftストアから入手しているとダメらしいという情報を見つけ、Pythonの公式ホームページからPythonをインストールしてみました。

すると正常に動きました。現在はVisual Studio Codeで課題に取り組んでいるので、まだまだエディター上で動かせれば十分なのですが、Pythonに退屈なことをやらせるためには避けて通れない課題な気がするので、とりあえず今回解決出来て良かったですね。

次の記事はこちら↓

『退屈なことはPythonにやらせよう』その4 (6章:文字列操作)” に対して2件のコメントがあります。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です