###前提・実現したいこと
Pythonで文字列を検索するプログラミングを作成しています。
以下のように、複数項目の後読み(および先読み。以下、「後読み」とだけ表記します)を行いたいです。
つまり、「<AAA>の中の<BBB>の中の111」を取り出したいです。
string1のときは、普通の後読みを行っているので勿論「111」と表示されます。
問題はstring2の方で、こちらは、<AAA>と<BBB>の間に<CCC>がはさまっています
「<AAA>の後読みを行い、その後<BBB>の後読みを行う」という2項目の後読みを試みましたが、以下のエラーが表示されました。
調べたところ、後読みは一定文字列しか扱うことができず、きちんと「<AAA><CCC><BBB>」と書くしか無さそうでした。
string1とstring2を同様の後読みにより処理したいという希望があり、このような点で頭を悩ませています。
何か上手い方法があればご教授下さい。
###発生している問題・エラーメッセージ
111 Traceback (most recent call last): File "question0.py", line 13, in <module> print matchOB2.group() AttributeError: 'NoneType' object has no attribute 'group'
###該当のソースコード
Python
1import re 2 3string1 = '<AAA><BBB>111</BBB></AAA>' 4string2 = '<AAA><CCC><BBB>111</BBB></CCC></AAA>' 5 6pattern1 = re.compile(r'(?<=<AAA><BBB>)\d+(?=</BBB></AAA>)') 7pattern2 = re.compile(r'(?<=<AAA>)(?<=<BBB>)\d+(?=</BBB>)(?=</AAA>)') 8 9matchOB1 = re.search(pattern1, string1) 10matchOB2 = re.search(pattern2, string2) 11 12print matchOB1.group() 13print matchOB2.group()
###試したこと
例えば
「pattern2 = re.compile(r'(?<=<AAA>).?(?<=<BBB>)\d+(?=</BBB>).?(?=</AAA>)')」
など、他の正規表現も利用してみました。すると
<CCC><BBB>111</BBB></CCC>
と出力されました。
しかし今は、「111」という文字列のみ取得したいので、他の部分は不要です。
###補足情報(言語/FW/ツール等のバージョンなど)
python2.7
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/08/14 13:30