Top 8
Outer WildsストーリーMODを色々やってみた
June 18, 2023, 10:04 a.m.表面符号と戯れる【量子コンピューター Advent Calendar 2023 23 日目】
Dec. 23, 2023, 3:28 a.m.位数発見アルゴリズム ~Quantum Zooやっていく【特別編】~
Jan. 27, 2023, 2:50 p.m.ストーリー追加 Mod: The Outsider やっていく日記【Outer Wilds】
Feb. 19, 2023, 6:33 a.m.意識が量子効果で生じることを示す実験結果についてちょっと調べただけのメモ
April 21, 2022, 3:09 p.m.ストーリー追加 MOD: Astral Codec やっていく日記【Outer Wilds】
Feb. 25, 2024, 8:47 a.m.Outer Wilds の量子は計算能力が(ある程度)すごいのではという話
Jan. 15, 2022, 8:35 a.m.MacでAge of Empires 2 DE (AoE2DE)をCrossOverで動かす
May 31, 2021, 11:52 a.m.正規表現のre.search().groups()とre.findall()の違い【Python】
Oct. 11, 2019, 12:12 a.m. edited Aug. 7, 2020, 8:26 a.m.大学のプログラミングの授業(Python)でTAをしているのですが、ここで
abc123xyz
に含まれる数字を正規表現で抜き出す(出力例は123
)という課題が出ました1。この解法として、
>>> import re
>>> re.search('\d+', 'abc123xyz').group()
'123'
があります。一方、ここで
>>> re.search('\d*', 'abc123xyz').group()
''
とすると空文字列が返ってきます。正規表現は最長一致を返すのにもかかわらず、なぜこうなるのかと質問が出ました。
.groups()
とre.findall()
の違い
この挙動を理解するには正規表現のグループとマッチした文字列全体の違いについて知らなければなりません。理解しやすくするために問題を少し変えて
abc123xyz456
とします。すると、
>>> re.search('\d+', 'abc123xyz456').group()
'123'
となります。これはre.search()
は最初にマッチした文字列全体2を返すためです。ここで、groups()
もありますが、その結果は
>>> re.search('\d+', 'abc123xyz456').groups()
()
と何もありません。それもそうで、正規表現中でグループ(()
)を指定していないためです。そこで、\d+
をグループで括ってやると、
>>> re.search('(\d+)', 'abc123xyz456').groups()
('123',)
と得られます。これだとグループの恩恵がわかりづらいので、数字の前のアルファベットもグループで括ると、
>>> re.search('([A-Za-z]+)(\d+)', 'abc123xyz456').groups()
('abc', '123')
となります。ここでgroup()
には引数を渡すことができ、
>>> re.search('([A-Za-z]+)(\d+)', 'abc123xyz456').group(1)
'abc'
>>> re.search('([A-Za-z]+)(\d+)', 'abc123xyz456').group(2)
'123'
>>> re.search('([A-Za-z]+)(\d+)', 'abc123xyz456').group() # .group(0)と同じ
'abc123'
と引数でグループの何番目の文字列を得るかを指定できます。引数を与えない場合のデフォルトが0
であり、これはマッチした文字列全体を返します。
一方、.groups()
と混同しやすいre.findall()
では何を返すかというと、
>>> re.findall('([A-Za-z]+)(\d+)', 'abc123xyz456')
[('abc', '123'), ('xyz', '456')]
とマッチした文字列全体をすべて見つけて返します。
つまり、.groups()
は最初にマッチした文字列全体の中でグループに分けて返し、一方re.findall()
はすべてのマッチした文字列全体をそれぞれグループに分けて返すという違いがあります。
冒頭の問題の答え
re.findall()
をすれば理由は明らかとなります。
>>> re.findall('\d+', 'abc123xyz')
['123']
>>> re.findall('\d*', 'abc123xyz')
['', '', '', '123', '', '', '', '']
つまり、\d*
はa
やb
の間にあるような空文字列に対しても最長一致でマッチした文字列全体と認識するので、re.search()
は最初に見つかったマッチした文字列全体である''
を返していたということになります。
Top 8
Outer WildsストーリーMODを色々やってみた
June 18, 2023, 10:04 a.m.表面符号と戯れる【量子コンピューター Advent Calendar 2023 23 日目】
Dec. 23, 2023, 3:28 a.m.位数発見アルゴリズム ~Quantum Zooやっていく【特別編】~
Jan. 27, 2023, 2:50 p.m.ストーリー追加 Mod: The Outsider やっていく日記【Outer Wilds】
Feb. 19, 2023, 6:33 a.m.意識が量子効果で生じることを示す実験結果についてちょっと調べただけのメモ
April 21, 2022, 3:09 p.m.ストーリー追加 MOD: Astral Codec やっていく日記【Outer Wilds】
Feb. 25, 2024, 8:47 a.m.Outer Wilds の量子は計算能力が(ある程度)すごいのではという話
Jan. 15, 2022, 8:35 a.m.MacでAge of Empires 2 DE (AoE2DE)をCrossOverで動かす
May 31, 2021, 11:52 a.m.Tags
- #Python (26)
- #量子力学 (25)
- #量子情報 (23)
- #Unity (11)
- #Outer Wilds (11)
- #数学 (9)
- #Mac (9)
- #AoE2 (8)
- #Linux (7)
- #Quantum Zoo (6)
- #意識 (5)
- #シミュレーション (5)
- #NumPy (5)
- #Bash (5)
- #相対論 (4)
- #Docker (4)
- #Android (4)
- #Qiskit (4)
- #Rust (3)
- #PyO3 (3)
- #GitHub (3)
- #Django (2)
- #情報理論 (2)
- #LaTeX (2)
- #AR (2)
- #Git (2)
- #iOS (2)
- #C++ (2)
- #正規表現 (2)
- #論文 (2)
- #電磁気学 (1)
- #Google Drive (1)
- #Overleaf (1)
- #Let's Encrypt (1)
- #ポケモン (1)
- #AdMob (1)
- #Autoya (1)
- #docopt (1)
- #SymPy (1)
- #AWS (1)
- #Twitter (1)
- #URP (1)
- #iMovie (1)
- #PyTorch (1)
- #C# (1)
- #Vim (1)