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.findall()と重複の落とし穴【Python】
Oct. 16, 2019, 6:02 a.m. edited Dec. 21, 2019, 5:19 a.m.前回(正規表現のre.search().groups()とre.findall()の違い【Python】)の続きです。引き続きPythonと正規表現のreモジュールでやっていきます。
まずは問題(という落とし穴)
sssabcssssssdefsssdefsss
という文字列からabc
から始まりdef
で終わる3の倍数の長さでかつ最長の文字列を抽出したいとします(つまりabcssssssdefsssdef
)。
これは正規表現を使って、
>>> re.search('abc(...)*def', 'sssabcssssssdefsssdefsss').group()
'abcssssssdefsssdef'
でできます。結果がabcssssssdef
ではなくabcssssssdefsssdef
となるのは、正規表現が最長一致をとってくるからです。
では、
sssabcsabcssdefsssdefsssssssssssssssssssdefs
という文字列であった場合はどうなるでしょう。最長のabcssdefsssdefsssssssssssssssssssdef
をとってきてほしいところですが、果たして...!
>>> re.search('abc(...)*def', 'sssabcsabcssdefsssdefsssssssssssssssssssdefs').group()
'abcsabcssdefsssdef'
はい、そうなる気はしていました。というのも、前回触れたように、
re.search()
は最初にマッチした文字列全体を返す
ためです。一方、re.findall()
は
マッチした文字列全体をすべて見つけて返します。
そこで、re.findall()
を使ってみる1と、
>>> re.findall('(abc(...)*def)', 'sssabcsabcssdefsssdefsssssssssssssssssssdefs')
[('abcsabcssdefsssdef', 'sss')]
1つのマッチした文字列全体(のグループ)しか出てこないじゃんっ!!!
原因
どうやらre.findall()
はマッチした文字列全体を1つ見つけると、次のマッチした文字列全体をそれ以降の文字列から探すようです。つまり、2つのマッチした文字列全体が重複していると、最初の方しか抽出されないことになります。つまり、今回の例でいうと、
sssabcsabcssdefsssdefsssssssssssssssssssdefs
から最初のマッチした文字列全体abcsabcssdefsssdef
を取り出す。すると、残りの文字列は
sssssssssssssssssssdefs
となるので、ここから次のマッチした文字列全体を探す(が、もちろん存在しないので、探索は終了)。ということになります。
対策
肯定的先読み?=
を使います。
>>> re.findall('(?=(abc(...)*def))', 'sssabcsabcssdefsssdefsssssssssssssssssssdefs')
[('abcsabcssdefsssdef', 'sss'), ('abcssdefsssdefsssssssssssssssssssdef', 'sss')]
これは?=
の後ろにパターン(今回は'(abc(...)*def)'
)がある場合に?=
の手前のパターン(今回は''
つまり空文字列)に一致します。したがって、re.findall()
の挙動としては、
sssabcsabcssdefsssdefsssssssssssssssssssdefs
から最初のマッチしたパターン''
を取り出す。すると、残りの文字列は
bcsabcssdefsssdefsssssssssssssssssssdefs
となるので、次に再びマッチしたパターンを取り出すことができます2。
あとは、問題の目的としては最長の文字列を得ることなので、re.findall()
で得られた文字列の中で最長のものをとってくれば良いです。例えば、
>>> all_groups = re.findall('(?=(abc(...)*def))', 'sssabcsabcssdefsssdefsssssssssssssssssssdefs')
>>> max(all_groups, key=lambda x: len(x[0]))[0]
'abcssdefsssdefsssssssssssssssssssdef'
という感じで。
-
全体に括弧をつけてグループ化しないと、真ん中の括弧で包まれた3文字しか得られずわかりづらいので、パターン文字列を
(abc(...)*def)
とした。 ↩ -
あくまでもマッチした文字列全体としてはただの空文字列
''
なので、re.search()
の挙動としては、
となる。 ↩>>> re.search('(?=(abc(...)def))', 'sssabcsabcssdefsssdefsssssssssssssssssssdefs').group() '' >>> re.search('(?=(abc(...)def))', 'sssabcsabcssdefsssdefsssssssssssssssssssdefs').group(1) 'abcsabcssdefsssdef' >>> re.search('(?=(abc(...)def))', 'sssabcsabcssdefsssdefsssssssssssssssssssdefs').group(2) 'sss' >>> re.search('(?=(abc(...)def))', 'sssabcsabcssdefsssdefsssssssssssssssssssdefs').groups() ('abcsabcssdefsssdef', 'sss')
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)