上級Python開発コース
チャプター
>
レベル
文字列と時間モジュール
正規表現モジュール
目標
正規表現を使用して、従業員およびゾーニング割り当てに関するファイルを検証し、整理します。
隣接するオフィスには、新しい農地での勤務を開始する従業員や、作物と家畜の世話をするゾーンに関して更新が必要な書類がいくつかあります。特に大量の文字列テキストを扱う場合、ファイルの管理は非常に困難になります。この目的のために、正規表現(Regex とも略される)である re モジュールを使用します。私たちは import re を使ってその関数にアクセスし、このレベルでは以下の関数を使用します:
re.findall(): 文字列中のすべての出現箇所のリストを返します。2つの引数が必要で、1つ目は検索対象の文字、2つ目は検索する文字列です。re.sub(): 指定された出現箇所をある文字列で置換します。3つの引数が必要で、1つ目は置換したい文字、2つ目は置換後の文字列、3つ目は検索対象の文字列です。re.search(): 文字列内で特定の文字の位置を見つけ、オブジェクトを返します。2つの引数が必要で、1つ目は検索する文字、2つ目は検索対象の文字列です。返されたオブジェクトに対しては、span()などの他の関数を使用して、検索対象の項目の開始位置と終了位置を含むベクトルを取得できます。re.split(): 文字列を指定した区切り文字で分割し、リストを返します。2つの引数が必要で、1つ目は分割の基準となる文字列、2つ目は分割対象の文字列です。re.match(): 文字列の先頭に特定の値が含まれているかを確認します。これはre.search()の簡略版として機能しますが、より効率的に文字列の先頭がクエリに一致するかをチェックします。
re モジュールは特殊シーケンスも使用できます。これにより、様々な文字列の性質を包含するコードが利用可能です。特殊シーケンスは多数ありますが、このレベルでは以下のものを使用します:
\B: 指定された文字が、単語の先頭や末尾ではなく文字列内に存在するかどうかを確認します。\D: 0-9 の数字以外の文字を返します。
特殊シーケンスの前に r が付いている場合、それは生の文字列(raw string)をチェックしていることを意味します。
まず、金色の X 印まで歩いて行き、メモが置かれたテーブルの前に立ち、read() 関数を使用して、全従業員の名簿が記載されたメモを確認してください。各名前には従業員番号を示す # が含まれており、名前が記載された文字列は manifest という定数にも保存されています。
次に、tags という名前のリストを作成し、re.findall() を使用して manifest 定数内のすべての # を検索した結果を格納します。例えば、tags = re.findall("#", manifest) のように記述します。その後、number という変数を作成し、len() を使って tags リスト内の項目数をカウントします。これにより、名簿に含まれる従業員数が分かります。最後に、speak() 関数と number 変数を使用して、リスト内の名前の数を発表してください。
次に、青いカーペットの横にある明るい X 印まで歩いて行き、机の前に立って read() 関数を使用してください。ここには、新規採用者とその任命された役職のリストが表示されます。各職業ごとの名前を記録し、現在割り当てられている人々と照合できるようにしてください。続いて、青いカーペット上の X 印まで歩いて行き、再度 read() 関数を使用して、現在の職務割り当てを確認してください。
現在の従業員リストは assignments という定数に保存されています。この文書は、新規採用者リストの情報で更新する必要があります。re.sub() 関数を使用して、リスト内で異なる名前を文字列の一部で置換してください。例えば、以下のような編集が行われます:
assignments = re.sub("Billy Hodgins", "Carol Hopkins", assignments)
ドキュメント内では、"Billy Hodgins" が "Carol Hopkins" に置き換えられます。この変更に加えて、文書全体を完全に更新するために、もう一つの名前も確認して更新してください。結果を確認するには、assignments を用いて write() 関数を使用してください。
従業員名簿の処理が完了したので、次は農場のゾーニングに移ります。赤いカーペット上の暗い X 印まで歩いて行き、read() 関数を使用してください。これにより、ゾーニングに関する詳細なレビューが表示されます。この情報は zones という定数に保存されています。
特に重要なのは、ゾーンが再評価される必要があるため、ドキュメント内の 6210 の位置を特定することです。これを行うために、re.search() 関数を使用して、ゾーニング内で該当するセクター番号の位置を特定します。index という変数を作成し、検索オブジェクトを格納してください。検索文字列は r"6210\B" に設定します。つまり、r は生文字列を示し、6210 は探しているゾーンセクターで、\B は検索のための特殊シーケンス基準です。以下のように実行します: index = re.search(r"6210\B", zones) 。
index が検索オブジェクトを保持したので、span() を使用してそこからデータを抽出します。vector という変数を作成し、検索オブジェクトの位置情報を格納してください。例: vector = index.span() 。設定が完了したら、その vector 変数を使って、あらかじめ用意された write() 関数を呼び出してください。
次に、ゾーニング項目を識別する作業に移ります。緑のカーペット上の暗い X 印まで歩いて行き、sectors という名前のリストを作成し、re.split() 関数を使用して、様々なゾーニングセクターを1つのリストに統合します。split 関数では、特殊シーケンス "\D" を使用して、zones 変数から数字のみを抽出します。さらに、リスト内包表記と len() 関数を活用して、セクター番号として不十分な空の項目を削除します。例えば:
sectors = re.split("\D", zones) sectors = [x for x in sectors if len(x) > 3]
zones を使い、write() 関数で全てのゾーニングセクターを一覧表示してください。
紫のカーペットの横にある明るい X 印まで歩いて行き、書類棚の前に立って、read() 関数を使用し、農場ゾーニングにおける優先セクターを確認してください。これらのセクターがゾーニングリストに存在するかどうかを検証するため、しっかりと記録を取ってください。
最後に、紫のカーペット上の暗い X 印まで歩いて行きます。コードエディタにあらかじめ用意されている sector_a、sector_b、sector_c という3つの優先セクターの変数に、明るい X 印で読み取った値を挿入してください。これらの変数は、sectors リスト内の全項目を走査し、re.match() 関数でフィルタリングするリスト内包表記を使用しています。レベルを完了するため、sector_a、sector_b、sector_c の各変数をあらかじめ用意された write() 関数に挿入してください。