pythonの自然言語処理にて、正規表現の記述方法に困っております。
#試したこと
"[国\n|略名 =イギリス\n|日本語国名 = グレートブリテン及び北アイルランド連合王国\n|"という文字列から、('略名', 'イギリス'), ('日本語国名', 'グレートブリテン')のようなタプルのリストに変換しようとしています。
python
1import re 2 3text = "[国\n|略名 =イギリス\n|日本語国名 = グレートブリテン\n|" 4 5pattern1 = r'^\|(.+?)\s*\=\s*(.+?)(?:(\n\|)|(\n$))' 6pattern2 = r'^\|(.+?)\s*\=\s*(.+?)(?:(?=\n\|)|(?=\n$))' 7 8result1 = re.findall(pattern1, text, re.MULTILINE) 9print(result1) 10result2 = re.findall(pattern2, text, re.MULTILINE) 11print(result2)
#出力結果 [('略名', 'イギリス', '\n|', '')] [('略名', 'イギリス'), ('日本語国名', 'グレートブリテン')]
##質問
pattern1とpattern2は同じ結果になるだろうと想定して書いたのですが、結果に差が出ました。
?:
は「この括弧はグループとして記憶しない」という意味のようですので、pattern1では\n\|
または\n$
にマッチしても記憶しないと思ったのですが、結果が上記のようになってしまった理由が理解できません。
調べると?=
は「肯定的先読み」とのことですので、直後に\n\|
または\n$
がある文字列を返しているのは理解できますが、pattern1とpattern2でこのような差が出てしまうのは何故でしょうか。
##動作環境
APPLE MacBook-Pro python 3.8.5
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/02/25 06:19 編集
2021/02/25 06:21
2021/02/25 06:34
2021/02/25 06:53