正規表現_学習ノート_000_一覧

# pycharmに「正規表現チェックツール」の呼び出す方法
- カーソルは正規表現パターンの文字列中に置いて、「Alt+Enter」を押下して下記のポップアップウインドウズを呼び出すことができる  
![reg001.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/551056/f1e23485-3781-f7bd-f24f-d96e5822bf57.png)
![reg002.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/551056/b625bfcc-98e0-f3b1-6ef7-71eea2e313e0.png)

# 正規表現のメタ文字リファレンス
- 文字クラス

|pattern       | 説明文                                     |サンプル|
|:------------|:-------------------------------------------|:------------|
|[abc]        |a、b、または c (単純クラス)                   |[pattern_01_01](#pattern_01_01)|
|[^abc]       |a、b、c 以外の文字 (否定)                    |pattern_01_01|
|[a-zA-Z]     |a から z または A から Z (範囲)              |pattern_01_01|
|[a-d[m-p]]   |a から d、または m から p:[a-dm-p] (結合)    |pattern_01_01|
|[a-z&&[def]] |d、e、f (交差)                              |pattern_01_05|
|[a-z&&[^bc]] |b と c を除く a から z:[ad-z] (減算)         |pattern_01_06|
|[a-z&&[^m-p]]|m から p を除く a から z:[a-lq-z] (減算)     |pattern_01_07|

- 定義済文字クラス

|pattern       | 説明文                                     |サンプル|
|:------------|:-------------------------------------------|:------------|
|. |任意の文字 (行末記号とマッチする場合もある)           |[pattern_02_01](#pattern_02_01)|
|¥d|数字: [0-9]                         |[pattern_02_02](#pattern_02_02)|
|¥D|数字以外: [^0-9]                      |[pattern_02_03](#pattern_02_03)|
|¥s|空白文字: [ ¥t¥n¥x0B¥f¥r]             |pattern_02_04|
|¥S|非空白文字: [^¥s]                      |pattern_02_05|
|¥w|単語構成文字:[a-zA-Z_0-9]               |pattern_02_06|
|¥W|非単語文字: [^¥w]                      |pattern_02_07|

- 境界表現エンジン

|patten       | 説明文                                     |サンプル|
|:------------|:-------------------------------------------|:------------|
|^ |行の先頭                                                |pattern_03_01|
|$ |行の末尾                                                |pattern_03_02|
|¥b|単語境界                               |pattern_03_03|
|¥B|非単語境界                              |pattern_03_04|
|¥A|入力の先頭                              |pattern_03_05|
|¥G|前回のマッチの末尾                          |pattern_03_06|
|¥Z|最後の行末記号がある場合は、それを除く入力の末尾           |pattern_03_07|
|¥z|入力の末尾                              |pattern_03_08|

- 最長一致数量子

|pattern       | 説明文                                     |サンプル|
|:------------|:-------------------------------------------|:------------|
|X?    |X、1 または 0 回        |pattern_04_01|
|X*    |X、0 回以上            |pattern_04_02|
|X+    |X、1 回以上            |pattern_04_03|
|X{n}  |X、n 回              |pattern_04_04|
|X{n,} |X、n 回以上            |pattern_04_05|
|X{n,m}|X、n 回以上、m 回以下      |pattern_04_06|

- 最短一致数量子

|pattern       | 説明文                                     |サンプル|
|:------------|:-------------------------------------------|:------------|
|X??    |X、1 または 0 回        |pattern_05_01|
|X*?    |X、0 回以上            |pattern_05_02|
|X+?    |X、1 回以上            |pattern_05_03|
|X{n}?  |X、n 回              |pattern_05_04|
|X{n,}? |X、n 回以上            |pattern_05_05|
|X{n,m}?|X、n 回以上、m 回以下      |pattern_05_06|

- 強欲な数量子

|pattern       | 説明文                                     |サンプル|
|:------------|:-------------------------------------------|:------------|
|X?+    |X、1 または 0 回       |pattern_06_01|
|X*+    |X、0 回以上           |pattern_06_02|
|X++    |X、1 回以上           |pattern_06_03|
|X{n}+  |X、n 回             |pattern_06_04|
|X{n,}+ |X、n 回以上           |pattern_06_05|
|X{n,m}+|X、n 回以上、m 回以下     |pattern_06_06|

# 参照したサイト
[正規表現サンプル集](https://www.megasoft.co.jp/mifes/seiki/)
[Regular Expression Test Drive](https://regex-testdrive.com/ja/)
[Pythonの正規表現モジュールreの使い方（match、search、subなど）](https://note.nkmk.me/python-re-match-search-findall-etc/)
[Java正規表現の使い方](https://www.javadrive.jp/start/regex/)
[基本的な正規表現一覧](https://murashun.jp/blog/20190215-01.html#chapter-4)

# サンプルソース（編集中）
サンプルの共通部分

```reg_import.py
import re
```
#pattern_01_01
```reg_sample_01_01.py
# %% [abc]a、b、または c (単純クラス)
print(re.findall(r'[abc]', 'bbbacdef'))  # ['b', 'b', 'b', 'a', 'c']

# [^abc]a、b、c 以外の文字 (否定)
print(re.findall(r'[^abc]', 'bbbacdef'))  # ['d', 'e', 'f']

# [a-zA-Z]a から z または A から Z (範囲)
print(re.findall(r'[a-zA-Z]', 'Aa@Zz'))  # ['A', 'a', 'Z', 'z']

# [a-dm-p]a から d、または m から p:[a-dm-p] (結合)
print(re.findall(r'[a-dm-p]', 'abcefmopq'))  # ['a', 'b', 'c', 'm', 'o', 'p']
```

#pattern_02_01
```reg_sample_02_01.py
# %% 「.」任意の文字 (行末記号とマッチする場合もある)
# bから始まってkで終わる3桁の文字列
print(re.findall(r'b.k', 'bk'))  # []
print(re.findall(r'b.k', 'bok'))  # ['bok']

# 「*」直前のパターンを0回以上繰り返し
# bから始まってkで終わる2桁以上の文字列
print(re.findall(r'b.*k', 'bk'))  # ['bk']
print(re.findall(r'b.*k', 'bok'))  # ['bok']
print(re.findall(r'b.*k', 'bk bok book boook'))  # ['bk bok book boook']
print(re.findall(r'b.*k', 'bbb'))  # []

# 「+」直前のパターンを1回以上繰り返し
# bから始まってkで終わる3桁以上の文字列
print(re.findall(r'b.+k', 'bk'))  # []                                     
print(re.findall(r'b.+k', 'bok')) # ['bok']                                
print(re.findall(r'b.+k', 'bk bok book boook'))  # ['bk bok book boook']   
```
#pattern_02_02
```reg_sample_02_02.py
# %% 「\d」半角数字
# 半角数字１文字
print(re.findall(r'\d', '1234'))  # ['1', '2', '3', '4'] 
print(re.findall(r'\d', 'a234'))  # ['2', '3', '4']      

# %% 「\d+」数字列
# 「+」直前のパターンを1回以上繰り返し
print(re.findall(r'\d+', '1234abc'))  # ['1234']     
print(re.findall(r'\d+', 'a1234abc'))  # ['1234']    

# %% 「\d{4}」４桁の数字
# 「{n}」直前のパターンをn回繰り返し
print(re.findall(r'\d{4}', '1234abc'))  # ['1234']   
print(re.findall(r'\d{4}', '123abc'))  # []          

# %% 「{n,}」直前のパターンをn回以上繰り返し
print(re.findall(r'\d{4,}', '1234 567890'))  # ['1234', '567890']
print(re.findall(r'\d{4,}', '〒123-4567'))  # ['4567']            

# %% 「{n,m}」直前のパターンをn～m回以上繰り返し（最長一致）
# 最長一致なので、10桁の文字列を探して、なければ、9桁、8桁…の順に検索します。
print(re.findall(r'\d{4,10}', '1234 901234567890'))  # ['1234', '9012345678']    
print(re.findall(r'\d{4,10}', '123 4567'))  # ['4567']                           

# %% 「?」直前の繰り返し指定を最短一致にする。
print(re.findall(r'\d{4,10}?', '1234 1234567890'))   # ['1234', '1234', '5678']   
print(re.findall(r'\d{4,10}?', '123 4567'))          # ['4567']                   
```
#pattern_02_03
```reg_sample_03_02.py
# %% 「\D」半角数字以外
print(re.findall(r'\D', 'TEL:03-1234-5678'))  # ['T', 'E', 'L', ':', '-', '-'] 
print(re.findall(r'\D', '1年1組'))  # ['年', '組']