はじめに
プログラミングコンテストの過去問の練習問題を題材に、文字列の置換、正規表現について解説します。
1.プログラミングコンテスト過去問の課題
以下の問題です。
文字列 S が与えられるので、正規表現を用いて、文字列 S において以下のパターンを検索し、マッチした部分をすべて削除した文字列を出力してください。
パターン: 文字列 import の後に 1 文字以上の半角英数字列が続く文字列
ただし、検索対象のパターンが複数回出現する場合は、最初に出現するものを繰り返し削除してください。
検索は最左最長一致でおこなってください。
また、文字列の先頭の位置を 0 として、各文字の位置を左から順に 0, 1, 2, ... とします。
2.実装したソースコード
私の方で実装したソースコードは以下になります。
import re
s = input()
ans = re.sub(r'import [0-9A-Za-z]+',r'',s)
print(ans)
3.正規表現の解説
pythonでは以下の表にまとめた正規表現を使います。
(表は私の忘備録でもあります)
| 文字 | 説明 | 同様 | 例 | マッチする | マッチしない |
|---|---|---|---|---|---|
| \d | 任意の数字 | [0-9] | |||
| \D | 任意の数字以外 | [^0-9] | |||
| \s | 任意の空白文字 | [\t\n\r\f\v] | |||
| \S | 任意の空白文字以外 | [^\t\n\r\f\v] | |||
| \w | 任意の英数字 | [a-zA-Z0-9_] | |||
| \W | 任意の英数字以外 | [\a-zA-Z0-9_] | |||
| \A | 文字列の先頭 | ^ | |||
| \Z | 文字列の末尾 | $ | |||
| . | 任意の一文字 | - | a.c | abc, acc, aac | abbc, accc |
| ^ | 文字列の先頭 | - | ^abc | abcdef | defabc |
| $ | 文字列の末尾 | - | abc$ | defabc | abcdef |
| * | 0回以上の繰り返し | - | ab* | a, ab, abb, abbb | aa, bb |
| + | 1回以上の繰り返し | - | ab+ | ab, abb, abbb | a, aa, bb |
| ? | 0回または1回 | - | ab? | a, ab | abb |
| {m} | m回の繰り返し | - | a{3} | aaa | a, aa, aaaa |
| {m,n} | m〜n回の繰り返し | - | a{2, 4} | aa, aaa, aaaa | a, aaaaa |
4.私が正規表現を使う場合
正規表現は表を見つつ、簡単なスクリプトを作って実証しています。
最後に
文字列の置換を通して、正規表現について記事にしました。参考にしていただけると幸いです