質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Python 2.7

Python 2.7は2.xシリーズでは最後のメジャーバージョンです。Python3.1にある機能の多くが含まれています。

正規表現

正規表現とは特定の文字列によるパターンマッチングを行う際に用いられる宣言型プログラミングです。

Q&A

解決済

1回答

2712閲覧

Pythonでの複数項目の後読み(先読み)

UMA00

総合スコア18

Python 2.7

Python 2.7は2.xシリーズでは最後のメジャーバージョンです。Python3.1にある機能の多くが含まれています。

正規表現

正規表現とは特定の文字列によるパターンマッチングを行う際に用いられる宣言型プログラミングです。

0グッド

0クリップ

投稿2016/08/14 11:50

###前提・実現したいこと
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

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

これでほとんどできていると思います。

python

1pattern2 = re.compile(r'(?<=<AAA>).*?(?<=<BBB>)\d+(?=</BBB>).*?(?=</AAA>)')

グループを使って( \d+ の部分に注目 )

python

1pattern2 = re.compile(r'(?<=<AAA>).*?(?<=<BBB>)(\d+)(?=</BBB>).*?(?=</AAA>)')

結果を出すときに

python

1print matchOB2.group(1)

とすればとれるでしょう。

グループ/名前付きグループについて調べてみてください。

docs.python.jp 正規表現 グルーピング

投稿2016/08/14 12:59

flied_onion

総合スコア2604

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

UMA00

2016/08/14 13:30

ありがとうございます。解決しました!! グルーピングを使用するわけですね、これでまた正規表現を使用した検索の幅が広がりそうです。 ※group()はgroup(0)を表していて、Matchオブジェクトメソッドのデフォルトの引数だったんですね。何も考えず、おまじないのように「group()」を使用していました…。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問