mocchaso note

サーバーエンジニアが何か色々呟いているところ。

Python100本ノック 45本目~52本目

Python100本ノックを60本目辺りまで進めたので、前回に引き続き、問題に関するメモや感想等を小分けして書いていきたいと思います。
次は、45本目から52本目についてです。

qiita.com

  • q45~q48
    次の文について各問に答えよ。
    sentence = "Chicken Little"

  • q49~q52
    以下の詩を元に各問に答えよ。

poetry = "We have seen thee, queen of cheese,
    Lying quietly at your ease,
    Gently fanned by evening breeze,
    Thy fair form no flies dare seize.

    All gaily dressed soon you'll go
    To the great Provincial show,
    To be admired by many a beau
    In the city of Toronto.

    Cows numerous as a swarm of bees,
    Or as the leaves upon the trees,
    It did require to make thee please,
    And stand unrivalled, queen of cheese.

    May you not receive a scar as
    We have heard that Mr. Harris
    Intends to send you off as far as
    The great world's show at Paris.

    Of the youth beware of these,
    For some of them might rudely squeeze
    And bite your cheek, then songs or glees
    We could not sing, oh! queen of cheese.

    We'rt thou suspended from balloon,
    You'd cast a shade even at noon,
    Folks would think it was the moon
    About to fall and crush them soon."


45本目:ソースの先頭が、指定したパターンと一致しているか


この回では、正規表現のライブラリreを使いまくりました。

  • re.match().group():一致したパターンをリストとして取り出せるメソッド


46本目:ソース内に、指定したパターンと一致しているか


.*のことを、ワイルドカードというそうです。
検索する際どんなパターンにもマッチする特殊な文字です。呼び方は知りませんでした...。

  • re.search():指定したパターンと一致しているかを調べるメソッド


47本目:文字列の中に"n"を含むの文字列が何個あるか


  • re.findall():文字列の中に、指定した文字があるパターン全てを含んだリストを返すメソッド


48本目:"n"を”s”に置きかえよ


  • re.sub():文字列の置換を行えるメソッド


49本目:cから始まる全ての単語を表示


ここから、本格的に正規表現のパターンを指定しなければなりませんでした。
メタキャラクタの表を見ながら取り組みました。

忘れっぽい人のための正規表現チートシート

単語の境界に一致するメタキャラクタの\bだけ知りませんでした...。


50本目:cで始まる全ての4文字単語を表示


記事内の解法と少しだけ異なっていました。

  • 自分の解法:r"\bc\w*"findall→長さが4の文字列のみを含んだリストを、リスト内包表記で表した。

  • 記事内の解法:r"\bc\w{3}\b"

\w{3}と書けば、リストを作らなくても良かった…。 また、"c\w{3}"\bで挟むことで、単語のみを取り出せるようです。


51本目:rで終わる全ての単語を見つけよう。


当てはまるメタキャラクタをチートシートで確認しましたが、それ以外は特に問題無く解けました。


52本目:3個の連続した母音を含む全ての単語を見つけよう


  • 自分の解法:r"\b\w*[aiueo]{3}\w*\b"findall

  • 記事内の解法:r'\b\w*[aiueo]{3}[^aiueo\s]\w*\b'findall()

記事内の解法では、[^aiueo\s]が追加されています。
これが必要な理由をまだ理解できていません・・・。




今回は、正規表現に関する問題でした。
メタキャラクタの種類が多かったり、指定するパターンが複雑になったりと苦戦する場面が多々ありました。
その反面、正規表現をうまく使えると処理を効率化できるのを実感できました(q50)。
reライブラリにある機能は盛りだくさんですが、是非使えるようにしたいですね。