アプリ開発への道
目次
〜修飾子がマッチする回数〜
マッチする回数を指定
電話番号の正規表現では\dに続く{3}によって、ちょうど3つの\d(数字)とマッチします。
r'\d'は数字1つとマッチするという意味なので、r'\d{1}'でも表せます。
import re
pattern=re.compile(r'\d{3}-\d{4}-\d{4}') #数字3つ-数字4つ-数字4つと合致するパターンを指定
a=pattern.search('私の電話番号は090-0000-0000')
print(a)
#出力結果は
<re.Match object; span=(7, 20), match='090-0000-0000'>
マッチしてもしなくてもいい場合 ?
疑問符 ? は、直前のパターンが0回または1回出現することを表します。
import re
pattern=re.compile(r'35!?')
a=pattern.findall('私の年齢は35!')
b=pattern.findall('私の年齢は35') #!あるパターンとないパターン両方を指定
print(a)
print(b)
#出力結果は
['35!']
['35'] #!はあってもなくてもマッチしています
複数の文字が任意の場合 ()?
複数の文字が任意の場合は()でグループにしてグループに?をつけます。
例えば電話番号の上3桁の有無にかかわらず、電話番号を検索したい場合は…
import re
pattern=re.compile(r'(\d{3}-)?\d{4}-\d{4}') #(\d{3}-)?で任意のパターンを指定
a=pattern.search('私の電話番号は090-0000-0000')
b=pattern.search('私の電話番号は0000-0000')
print(a)
print(b)
#出力結果は
<re.Match object; span=(7, 20), match='090-0000-0000'>
<re.Match object; span=(7, 16), match='0000-0000'> #上3桁がある場合もない場合もマッチしました
? は「直前のパターンが0回または1回出現する」ことを表します。
グループ () の後ろに付けた場合は、そのグループ全体が任意になります。
0個以上の修飾子とマッチする *
アスタリスク * は、直前のパターンが0回以上出現することを表します。
つまりアスタリスク直前のパターンが、0回以上出現してもよいことを表します。
import re
pattern=re.compile(r'(\d{3}-)*\d{4}-\d{4}')
a=pattern.search('私の電話番号は090-0000-0000')
b=pattern.search('私の電話番号は090-090-090-090-0000-0000') #090が4回でもマッチします
c=pattern.search('私の電話番号は0000-0000')
print(a)
print(b)
print(c)
#出力結果は
<re.Match object; span=(7, 20), match='090-0000-0000'>
<re.Match object; span=(7, 32), match='090-090-090-090-0000-0000'>
<re.Match object; span=(7, 16), match='0000-0000'> #しっかりマッチしています
1回以上マッチする +
アスタリスク*が0回以上マッチするのに対し、プラス+は一回以上マッチすることを意味します。
プラス+は最低1回は出現する必要があります。
import re
pattern=re.compile(r'(\d{3}-)+\d{4}-\d{4}')
a=pattern.search('私の電話番号は090-0000-0000')
b=pattern.search('私の電話番号は090-090-090-090-0000-0000')
c=pattern.search('私の電話番号は0000-0000')
print(a)
print(b)
print(c)
#出力結果は
<re.Match object; span=(7, 20), match='090-0000-0000'>
<re.Match object; span=(7, 32), match='090-090-090-090-0000-0000'>
None #cは上3桁の番号がないのでマッチしませんでした。
修飾子まとめ
正規表現では、修飾子を使うことで「何回繰り返すか」を指定できます。
| 修飾子 | 意味 | 例 |
|---|---|---|
{3} | ちょうど3回 | \d{3} → 数字3桁 |
? | 0回または1回 | 35!? → 35 または 35! |
* | 0回以上 | (abc)* → ''、abc、abcabc |
+ | 1回以上 | (abc)+ → abc、abcabc |
{3}は指定した回数だけ繰り返します。?は「ある場合もない場合も許可する」ときに使います。*は0回以上なので、まったくなくてもマッチします。+は1回以上なので、最低1回は出現する必要があります。
修飾子は、直前の文字やグループ () に対して適用されます。
複数の文字をまとめて修飾したい場合は、() でグループ化してから修飾子を付けます。

コメント