Python の基礎
1. はじめにテキストを読んで各自で演習を行っていきます。プログラムを実行してもらいたい場所には、分かりやすいようにヘビのイラストを使用しています。
・・・テキストエディタを利用してください
・・・端末を利用してください

2. 基本的な計算
足し算は「+」、引き算は「-」を使って計算することができます。授業で作成した「sample01.py」のプログラムを以下のように書き換え、実行してみましょう。
sample01.py
print("Hello world")
print(1+2)
print(5-3)$ python3 sample01.py
Hello world32

python で使う算術演算子には、次の表のようなものがあります。sample01.py のプログラムを書き換えて、例にある計算を行ってみましょう。

算術演算子

意味

例+

加算（足し算）1+4-減算（引き算）

6-2*乗算（掛け算）

2*3/除算（割り算）4/2%

剰余（割り算の余り）

5%3**

べき乗（同じ数字を繰り返し掛ける）

6**2

1

計算結果

3. 変数
数値や文字などは、変数に入れ保存しておくことができます。変数とは、値を入れておく箱のようなものだと考えてください。変数に値を代入する場合は、次のように記述します。

変数 = 値プログラム内で文字列を記述する場合は、「"観光情報学"」のように、文字列を「"」（ダブルクォーテーション）で囲みます。
「"」は、半角文字です。変数 a に、「観光情報学」という文字列を代入したい場
合には、「a = "観光情報学"」と記述します。
変数を使ったプログラム「sample02.py」を作成し、実行してみましょう。
sample02.py
a=2
b=3
c=a+b
d = "観光情報学"

print(a)print(b)print(c)print(d)$ python3 sample02.py
2
35
観光情報学

2

4. データ型
データを便利に使うために、データ型（データのタイプ）が用意されています。データ型には以下のような様々な種類があります。
数値型



文字列型



リスト型



辞書型



タプル型



集合型

「1」、「2」のような数字は数値型、「"観光情報学"」のような文字列は文字列型です。ここでは、リスト型を説明します。
リスト型とは、複数のデータ（要素）をひとまとまり（リスト）にして扱うデータ型です。まとめたいデータ（要素）を、「,」（カンマ）で区切り、「[]」（大カッコ）でくくります。リスト型は、次のように記述します。

変数 = [ 値 1, 値 2, ・・・]

（例）
x = []# 空の状態で初期化する場合

y = [ 1, 2, 3, 4, 5]# 数値の場合

z = ["dog","cat","bird"]# 文字列の場合

リスト型を利用した「sample03.py」を作成し、実行してみましょう。
sample03.py
x = ["dog", "cat", "bird"]
print(x)$ python3 sample03.py['dog', 'cat', 'bird']

3

5. 条件分岐（if 文）
条件分岐とは、「プログラムに、状況に応じて異なる別々の処理をしてもらう機能」です。簡単に言うと「もし、～～なら＊＊する」という指示のことです。条件分岐は、「if」、「else」というキーワードを使って、次のように記述します。「if」の次に「条件式」と呼ばれる、条件判断を行う式を記述します。
条件式が成立する場合（True）は、処理 A が実行されます。条件式が成立しない場合（False）は、処理 B が実行されます。条件式は、空リストなど中身のないものは False と評価されます。

条件式が成立する場合は、処理 A が実行されます
if 条件式:

コロン
処理 A

タブ

else:

コロン
処理 Bタブ条件式が成立しない場合は、処理 B が実行されます

タブ（または半角スペース 4 個）

x の値が 60 以上であれば「合格」、それ以外であれば「不合格」と表示させるプログラム「sample04.py」を作成し、実行してみましょう。
sample04.py
x = 80
if x >= 60:
print("合格")# x が 60 点以上の場合には「合格」と表示

else:
print("不合格")# それ以外の場合には「不合格」と表示$ python3 sample04.py
合格4条件式には、以下のような比較演算子を利用することができます。

比較演算子

例

意味>

x>yx は y より大きい>=

x >= yx は y 以上

<x<y

x は y より小さい<=

x <= yx は y 以下

==

x==y

x は y と等しい!=x!=yx は y と等しくない

6. 繰り返し（for 文）
繰り返し処理を行いたい場合は、for 文や while 文を利用します。ここでは、for 文を説明します。for文は、次のように記述します（Python の for 文は、C 言語などの for 文と多少異なります）。

繰り返し処理を行いたいデータから取り出した要素を代入するための変数リストや辞書
for

変数 in

タブ

繰り返し処理を行いたいデータ :
処理 A

コロン

繰り返し処理 A が実行されます

繰り返し処理を行いたいデータに、リスト型のデータを指定すると、リストの各要素に対して繰り返し処理を行うことができます。

for 文を使用して、リストの要素を順番に表示させるプログラム「sample05.py」を作成し、実行してみましょう。プログラムの流れのイメージ図は、次のページのようになります。
sample05.py
x = ["dog", "cat", "bird"]
for v in x:
print(v)5

$ python3 sample05.py
dogcatbird【

繰り返し処理 1 回目 】
変数 v に、リスト x の 1 番目の要素"dog"が代入されます["dog", "cat", "bird"]

for v in x:
print(v)【"dog"が表示されます

繰り返し処理 2 回目 】
変数 v に、リスト x の 2 番目の要素"cat"が代入されます["dog", "cat", "bird"]

for v in x:
print(v)【"cat"が表示されます

繰り返し処理 3 回目 】
変数 v に、リスト x の 3 番目の要素"bird"が代入されます["dog", "cat", "bird"]

for v in x:
print(v)※"bird"が表示されます

リストの最後の要素まで繰り返しの処理を行ったため、for 文の処理は終わります67. 標準ライブラリの利用
Python には便利なソフトウェア部品であるさまざまなモジュールが標準ライブラリとして多数用意されています。計算や処理を便利に行うための道具（モジュール）が道具箱（標準ライブラリ）に用意されていると考えてください。
Python では、使いたいモジュールをプログラムに読み込んで使用します。モジュールを読み込むには「import」というキーワードを使います。

import モジュール名

標準ライブラリにある「calendar」というモジュールを使用したプログラム「sample06.py」を作成してみましょう。「calendar」は、名前の通りカレンダーに関する情報を扱うことができます。
calendar.month の（）に、年と月の情報を入力すると、その月のカレンダーを表示できます。

sample06.py
import calendar
print(calendar.month(2017, 8))$ python3 sample06.py
August 2017
Mo Tu We Th Fr Sa Su
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

本講義では、標準ライブラリのみを使用しますが、外部からライブラリをインストールして利用することもできます。非常に多くのライブラリが登録されている PyPI（https://pypi.python.org/pypi）という Web サイトがあります。資料の執筆時点（2017 年 8 月）で 10 万を超えるライブラリが登録されています。

7

演習課題(1)以下のプログラムを作成してみましょう。

① 数値 num が与えられたとき、num が偶数の場合には、「偶数です」、奇数の場合には「奇数です」と表示させるプログラムを作成しなさい。
ファイル名： sample07.py② if 文を使用し、テストの点数 x が与えられたとき、評価を表示するプログラムを作成しなさい。
評価は、60 点未満は「不可」、60～69 点は「C」、70～79 点は「B」、80～89 点は「A」、90～100 点は「AA」とする。
※ if 文の elif の使い方を調べて使用してみましょう。
ファイル名： sample08.py③ 複数の数値が保存されているリストが与えられたとき、その数値の総和を求めるプログラムをfor 文を使用して作成しなさい。例えば、x=[2, 4, 6, 8]の場合、総和は 20（2+4+6+8）です。
ファイル名： sample09.py

8

8. ファイルの読み込み・書き込み
Python を利用してファイルを読み込んだり、書き込んだりする方法について説明します。ファイルを読み込む基本的な手順は、以下の通りです。
① open 関数を使用して、読み込みモードでファイルを開く② ファイルからデータを読み込む③ close メソッドを使用してファイルを閉じる「sent.txt」を読み込み表示させるプログラム「sample10.py」を作成してみます。Python では「#」（シャープ）がコメントアウト記号となり、「#」以降の記述は実行対象とはなりません。#以降にプログラムの説明を入力したり、#をプログラムの先頭に入力することで処理を飛ばしたりすることもできます。今回はコメント部分を入力する必要はありませんが、自分でプログラムを作成する場合は、コメントを入力し，後日プログラムを読み返しても分かるようにしておきましょう。

sample10.py
1# coding: utf-8

2
3

f = open("sent.txt", "r")# ファイルを読み込みモードで開く

for line in f:# ファイルに保存されている文を一行ずつ line に渡す

456line = line.rstrip()

7print(line)# 文末の改行コードを削除

89f.close()# ファイルを閉じる

10$ python3 sample10.py
今日は広島市立大学で授業に出席します。
僕は広島市立大学の学生です。
・・・
（省略）
・・・

【解説】
1 行目の「# coding: utf-8 」は、プログラムの文字コードを UTF-8 で指定する場合に必要です。今後プログラムを作成する場合は、「# coding: utf-8 」を 1 行目に入力するようにしてください。
3 行目では、open 関数を利用して、ファイルを読み込みモードで開いています。open 関数の 1 番目の引数にはファイル名を記述します。今回、読み込みたいのは「sent.txt」ですので、1 番目の引数には9「"sent.txt"」と記述します。2 番目の引数にはモードを記述します。モードは、ファイルを読み込みたい場合は「"r"」、書き込みたい場合は「"w"」を指定します。今回は、ファイルの内容を読み込みたいので、モードは「"r"」です。
for 文を利用することで、読み込みモードで開いたファイルに入力されている文を、1 行ずつ読み込むことができます。ここでは、「sent.txt」の 1 文ずつが、line という変数に代入されます。このように読み込まれた文の末尾には、テキストエディタでは見えませんが改行コードが付いています。6 行目で、改行コードを削除しています。7 行目では、1 行ずつ表示させています。
9 行目で、close メソッドを利用し、ファイルを閉じています。

次に、ファイルを書き込む方法について説明します。基本的な手順は以下の通りです。
① open 関数を使用して、書き込みモードでファイルを開く② write メソッドを使用してファイルにデータを書き込む③ close メソッドを使用してファイルを閉じる「sent.txt」を読み込み、「sent2.txt」にそのまま書き込むプログラムを作成します。先程作成した「sample10.py」を改良してみましょう。

sample10.py
1# coding: utf-8

2
3

f_in = open("sent.txt", "r")# ファイルを読み込みモードで開く

4

f_out = open("sent2.txt", "w")

# ファイルを書き込みモードで開く5
6

for line in f_in:# ファイルに保存されている文を一行ずつ line に渡す

7line = line.rstrip()# 文末の改行コードを削除

8

f_out.write(line)＃ line を書き出す

9

f_out.write("\n")# 改行（\n）を書きだす

10
11

f_in.close()12

f_out.close()# ファイルを閉じる$ python3 sample10.py
端末には何も表示されません。書き込みが正しく行われているか、「sent2.txt」を開いて確認してみましょう。
10

【解説】
3 行目では、open 関数を利用して、「sent.txt」を読み込みモードで開いています。
4 行目では、open 関数を利用して、「sent2.txt」を書き込みモードで開いています。
6 行目では、for 文を利用することで、読み込みモードで開いたファイルに入力されている文を、1 行ずつ読み込んでいます。ここでは、「sent.txt」の 1 文ずつが、line という変数に代入されます。7 行目
で、改行コードを削除しています。8 行目では、write メソッドを利用し、line に保存されている文を、書き込みモードで開いたファイルへ書き込みます。write メソッドは自動で改行を行わないため、9 行目で、改行コード（"\n"）を書き込みます。
11 行目、12 行目では、開いたファイルを close メソッドで閉じています。

9. 正規表現9.1. 正規表現とは正規表現とは、「文字列のパターン」を１つの文字列で表現する方法のことです。プログラミングで用いられる場合は、「文字列パターン」が含まれるかどうかを調べたり置換したりなどの機能とセットで利用されます。
Python で正規表現を用いる時は、re モジュールを利用します。正規表現を使って文字列とマッチングを行う関数には「search」と「match」があります。基本的な使い方は、以下の通りです。引数 patternに正規表現を指定し、string には文字列を指定します。正規表現にマッチしない場合は、「None」を返します。

re.search(pattern, string)

文字列中で、正規表現がマッチするかどうかを判定する。

re.match(pattern, string)

文字列の先頭で、正規表現がマッチするかどうかを判定する。

また、正規表現にマッチする部分をすべてリストとして返すとして「findall」があります。マッチする部分を全て取得することが可能です．

re.findall(pattern, string)

文字列中で、正規表現にマッチする部分文字列を全て探しだしリストとして返す。

正規表現にマッチするたびに文字列を分割する「split」があります。

re.split(pattern, string)

文字列中に、正規表現にマッチする部分があるたびに分割する。

11正規表現にマッチした部分を置換する「sub」があります。

文字列中の正規表現にマッチする部分を、文字列 s に置換する。
re.sub(pattern, s, string)

文字列 s に「""」を指定することで、正規表現にマッチする部分を削除することができる。

正規表現を利用して「sent.txt」から、「広島市立大学」という文字を含む文のみを表示するプログラム「ext_sent01.py」を作成しましょう。

ext_sent01.py
1# coding: utf-8

23

import re# re モジュールのインポート

4
5

f_in = open("sent.txt", "r")6
7

print("条件 1")

8

for line in f_in:9line = line.rstrip()

10m = re.search("広島市立大学", line)

11

if m:

12

print(line)

13
14

f_in.close()15$ python3 ext_sent01.py
条件 1
今日は広島市立大学で授業に出席します。
僕は広島市立大学の学生です。
先生が「私は広島市立大学の卒業生です。」と言いました。

12

【解説】
10 行目で、re.search を利用し、「広島市立大学」という文字が含まれているかどうかの判定を行っています。re.search の結果を、11 行目の if 文の条件式に入れることで、正規表現にマッチした場合には、12 行目の処理を行い、マッチしない場合は、なにも処理を行いません。

9.2. メタ文字
正規表現は、特定の文字に特別な意味を持たせます。この特定の文字を「メタ文字」といいます。このメタ文字を組み合わせることで、複雑な条件を表すことができます。Python で使う基本的なメタ文
字を、次の表に示します。

メタ文字意味例|

前後にある正規表現のどちらかと一致する*

直前の正規表現の 0 回以上の繰り返しに一致する+

直前の正規表現の 1 回以上の繰り返しに一致する?

直前の正規表現に 0 回もしくは 1 回一致する

a|ba または b のどちらかにマッチ
ab*a, ab, abb などにマッチ
ab+ab, abb などにマッチ
ab?cabc または ac にマッチ
a{1, 2}{m, n}

直前の正規表現の m 回以上 n 回以下の繰り返し

a, aa にマッチ
a{3,}aaa, aaaa, aaaaa…にマッチ[A-Za-z]
アルファベットどれか 1 文字にマッチ[][]内に指定した文字のどれかと一致する[ぁーん]
平仮名のどれか 1 文字にマッチ[0-9]
数字のどれか 1 文字にマッチ[^A-Za-z][^][]内に指定した文字でない場合に一致する

アルファベット以外の何か 1 文字にマッチ.

任意の 1 文字と一致する^

行頭と一致する$

行末と一致するa.
ab, ac, ad などにマッチ^a
行頭にある a にマッチ
a$
文末にある a にマッチ
13

()

正規表現をグループにまとめる\メタ文字を打ち消す\sスペース（空白文字）に一致\n改行に一致\t

タブに一致

メタ文字を利用して「sent.txt」から、以下の条件にマッチする文を表示させるプログラムを作成します。それぞれのプログラムを実行し、条件にマッチした文が正しく表示できているか確認してみましょう。


条件 2： 「今日」という文字列で始まる文を抽出する（ext_sent02.py）

条件 3： 「私は～です。
」という文字列が含まれる文を抽出する（ext_sent03.py）

ext_sent02.py
1# coding: utf-8

23

import re45

f_in = open("sent.txt", "r")「^」で行頭を指定

6
7

print("条件 2")

8

for line in f_in:9line = line.rstrip()

10m = re.search("^今日", line)

11if m:12「^今日」で，行頭が「今日」である
場合にマッチprint(line)

13
14

f_in.close()15$ python3 ext_sent02.py
条件 2
今日は広島市立大学で授業に出席します。
今日の天気は晴れです。

14

ext_sent03.py
1# coding: utf-8

23

import re45

f_in = open("sent.txt", "r")「.」は任意の一文字「+」は直前の正規表現の 1 回以上の繰り返し

6
7

print("条件 3")

8

for line in f_in:「私」で始まり、何文字か挟んで「です。
」という文字列が含まれる場合にマッチ

9line = line.rstrip()10

m = re.search("私は.+です。", line)

11

if m:

12

print(line)

13
14

f_in.close()15$ python3 ext_sent03.py
条件 3
私は広島経済大学の教員です。
私は 20 歳です。
先生が「私は広島市立大学の卒業生です。」と言いました。

「ext_sent03.py」を改良し、「私は～です。」の「～」の部分のみを抽出し表示してみましょう。正
規表現の中で「()」で囲んだ部分を、「group」を使うことで抽出することができます。

15

ext_sent03.py
1# coding: utf-8

23

import re4
5

f_in = open("sent.txt", "r")6
7

print("条件 3")

8

for line in f_in:

抽出したい部分を()で囲みます。

9line = line.rstrip()10

m = re.search("私は(.+)です。", line)

11

if m:

12

print(m.group(0))

13

print(m.group(1))

m.group(0)で、正規表現にマッチした部分全てを抽出できます。

14m.group(1)で、()で囲った部分を抽出できます。

15
16

f_in.close()17$ python3 ext_sent03.py
条件 3
私は広島経済大学の教員です。
広島経済大学の教員
私は 20 歳です。
20 歳
私は広島市立大学の卒業生です。
広島市立大学の卒業生

16

演習課題(2)「sent.txt」から、以下の条件にマッチする文または部分を表示させるプログラムを作成してください。それぞれのプログラムを実行し、正しく表示できているか確認してみましょう。



条件 4： 「です。
」という文字列で終わる文を抽出する（ext_sent04.py）

条件 5： 電話番号（ここでは 11 桁の数字を電話番号とみなす）を抽出する（ext_sent05.py）$ python3 ext_sent04.py
条件 3
僕は広島市立大学の学生です。
私は広島経済大学の教員です。
私の電話番号は 07011111111 です。
今日の天気は晴れです。
私の身長は 173cm です。
明日の天気は曇りです。
私は 20 歳です。
彼の携帯番号は、08099999999 です。

$ python3 ext_sent05.py
条件 307011111111
08099999999

1710. クローリング
インターネットにアクセスし、Web ページから情報を収集するクローリングの方法を説明します。
「urllib.request」モジュールを利用すると、インターネットにアクセスし Web ページから HTML 形式のデータを収集することができます。

Yahoo!JAPAN のトップページ（https://www.yahoo.co.jp/）を収集し、その結果を yahoo_ori.txtに保存するプログラム「request_yahoo.py」を作成しましょう。

request_yahoo.py
1# coding: utf-8

23

import urllib.request

4
5

f_out = open("yahoo_ori.txt", "w")6
7

url = "https://www.yahoo.co.jp/"# 収集したい URL を指定

8

res = urllib.request.urlopen(url)# 指定した URL のページの情報を取得する

9

data = res.read().decode("utf-8")# 取得したデータから read を使って中身取り出し10
11# 文字コードを指定して変数 data へ保存する
f_out.write(data)

1213

f_out.close()14$ python3 request_yahoo.py【解説】「urllib.request.urlopen」に収集したい URL を指定すると、指定した Web ページの情報を取得することができます。Web ページの情報の収集は 8 行目で行い、9 行目では、取得したページの情報から中身を取り出し、decode で文字コードを指定して変数 data へ保存しています。decode での文字コー
ドの指定は、Web ページのテキストエンコーディングが「UTF-8」の場合は「"utf-8"」、「EUC-JP」の場合は「"euc-jp"」です。Web ページのテキストエンコーディングは以下の方法で確認できます。
指定した Web ページを Firefox で開く ⇒ ページ上で右クリック ⇒ ページの情報を表示⇒ テキストエンコーディングを確認
18

プログラムを実行したら、yahoo_ori.txt を確認してみましょう。以下は、yahoo_ori.txt の例です。
Yahoo_ori.txt の中身は、データを収集した日時で異なります。

1911. スクレイピング
スクレイピングとは、取得した HTML 形式のデータから任意の情報を抽出する技術のことです。
「3.
クローリング」で収集した HTML 形式のデータ「yahoo_ori.txt」から、正規表現を利用して、以下の指定された個所を抽出してみましょう。

① Yahoo!Japan のトップページのタイトル② Yahoo!Japan のトップページに掲載されているニュースのタイトル（1 件のみ）

まずは、①を抽出する方法を検討します。
「yahoo_ori.txt」の中身を確認すると、トップページのタイトルは、<title></title>というタグで囲まれていることがわかります。

<!DOCTYPEHTMLPUBLIC"-//W3C//DTD

HTML

4.01

Transitional//EN""http://www.w3.org/TR/html4/loose.dtd">…（省略）…
<link rel="alternate" href="android-app://jp.co.yahoo.android.yjtop/yahoojapan/home/top"><title>Yahoo! JAPAN</title>…（省略）…

次に、②を抽出する方法を検討します。Yahoo!JAPAN のトップページには複数のニュースが掲載されていますが、今回は 1 件のみを抽出します。

20

「yahoo_ori.txt」の中身を確認すると、ニュースは、「<strong>ニュース</strong>」という文字列 が 含 ま れ る 行 に あ る こ と が わ か り ま す 。 ま た 、 ニ ュ ー ス の タ イ ト ル は 、「 <ahref="http://news.yahoo.co.jp・・・>」で始まるタグと、「</a>」または「<img…>」などのタグで囲まれていることがわかります。

…（省略）…
<tablewidth="100%"

border="0"bgcolor="#d7e0ff"><tr><td><img
height="4"><br><img

cellpadding="0"

src="//s.yimg.jp/images/clear.gif"

src="//s.yimg.jp/images/clear.gif"

cellspacing="0"
alt=""

alt=""

width="1"
width="10"

height="1"><strong>ニュース</strong><br><img src="//s.yimg.jp/images/clear.gif" alt=""
width="1"height="4"><br></td></tr><tr><td

bgcolor="#9fb6d5"><img

src="//s.yimg.jp/images/clear.gif" alt="" width="1" height="1"></td></tr></table><table
width="100%"

cellspacing="10"cellpadding="0"><tr><td><table

width="100%"

border="0" cellspacing="4" cellpadding="0"><tr><td><font size="-3" color="#666666">19時34分

更新</font></td></tr><tr><td>・<ahref="https://news.yahoo.co.jp/pickup/6251927"> 「 生 活 に 満 足 」 過 去 最 高 の74%</a></td></tr><tr><td>・<a href="https://news.yahoo.co.jp/pickup/6251923">不祥事

続くUber新CEO

決src="//s.yimg.jp/images/top/sp/cgrade/iconPhoto_150713.gif"
height="12" border="0"></a></td></tr><tr><td>…（省略）…

21

定へ

alt=" 写 真 "<imgwidth="16"①と②を抽出し、結果を「yahoo.txt」に保存するプログラム「ext_yahoo.py」を作成します。

ext_yahoo.py
1# coding: utf-8

23

import re4
5

f_in = open("yahoo_ori.txt", "r")6f_out = open("yahoo.txt", "w")7
8
9

for line in f_in:line = line.rstrip()<title>タグと</title>タグで囲まれた部分にマッチ

10
11# トップページのタイトルの抽出

12

title_top = re.search("<title>(.+)</title>", line)

13

if title_top:14

f_out.write(title_top.group(1))

15f_out.write("\n")16
17# ニュースのタイトルの抽出18

title_news=re.search("<strong>ニュース</strong>.+?<ahref=.+?>(.+?)<.+?>", line)
19「?」の使い方については、下記の補足

if title_news:

20

f_out.write(title_news.group(1))

21f_out.write("\n")2223f_in.close()24

f_out.close()$ python3 ext_yahoo.py「yahoo.txt」は以下のようになります。
Yahoo! JAPAN「生活に満足」過去最高の 74%
22を参照してください。

【補足】「ext_yahoo.py」には、「.+?」という正規表現が使われています。例えば、「<abc>012345<def>」という文字列がある場合に、「<」と「>」の間にある文字列とマッチさせたいとします。このとき、「<(.+)>」という正規表現を書くと、「abc>012345<def」が抽出されます。これは、「*」や「+」などの繰り返しを使った場合は、文字列のもっとも左側（先頭に近い方）からもっとも長い部分文字列と一致するためです。
「abc」を抽出したい場合は、繰り返しの後ろに「?」を使い「<(.+?)>」という正規表現を使います。
そうすると、文字列の最初に現れる「<>」とマッチさせることができます。

演習課題(3)「yahoo_ori.txt」から、Yahoo!Japan のトップページに掲載されているニュースのタイトルを全て抽出できるよう「ext_yahoo.py」を修正しましょう。「re.findall」を使います。

$ python3 ext_yahoo.py「生活に満足」過去最高の 74%
不祥事続く Uber 新 CEO 決定へ
・・・
（省略）
・・・

23