0

重複の可能性:
ネストされた構造とPythonの正規表現の照合

Wikiページの単一のデータグループを照合しようとしています。私が使用しているPythonコードのビットを以下に示します。問題は、それが自身のグループの終わりを過ぎて}}ページの最後に戻ることです。

def findPersonInfo(self):
    if (self.isPerson == True):
        regex = re.compile(r"{{persondata(.*)}}",re.IGNORECASE|re.UNICODE|re.DOTALL)
        result = regex.search(self._rawPage)
        if result:
            print 'Match found: ', result.group()

Wikiページのコンテンツのサンプル:

*[http://www.jsc.nasa.gov/Bios/htmlbios/acaba-jm.html NASA biography]

{{NASA Astronaut Group 19}}

{{Persondata
|NAME= Acaba, Joseph Michael "Joe"
|ALTERNATIVE NAMES=
|SHORT DESCRIPTION=[[Hydrogeologist]]
|DATE OF BIRTH={{Birth date and age|1967|5|17}}
|PLACE OF BIRTH=[[Inglewood, California]]
|DATE OF DEATH=
|PLACE OF DEATH=
}}
{{DEFAULTSORT:Acaba, Joseph M.}}
[[Category:1967 births]]

私の現在の正規表現は次の文字列を返しています:

{{Persondata
|NAME= Acaba, Joseph Michael "Joe"
|ALTERNATIVE NAMES=
|SHORT DESCRIPTION=[[Hydrogeologist]]
|DATE OF BIRTH={{Birth date and age|1967|5|17}}
|PLACE OF BIRTH=[[Inglewood, California]]
|DATE OF DEATH=
|PLACE OF DEATH=
}}
{{DEFAULTSORT:Acaba, Joseph M.}}

私はそれを返したいです:

{{Persondata
|NAME= Acaba, Joseph Michael "Joe"
|ALTERNATIVE NAMES=
|SHORT DESCRIPTION=[[Hydrogeologist]]
|DATE OF BIRTH={{Birth date and age|1967|5|17}}
|PLACE OF BIRTH=[[Inglewood, California]]
|DATE OF DEATH=
|PLACE OF DEATH=
}}

トリッキーな点は、他の開閉をカウントして、どのグループに立ち寄りたいかを知る必要{{}}あることですが、正規表現でそれを行う方法がわかりません。

4

2 に答える 2

2

{{persondata(.*)}}貪欲に一致します。つまり、可能な限り最長の一致を返そうとします。{{persondata(.*?)}}可能な限り最短の一致を取得したい場合に使用する必要があります。(これには名前がありませんか、おそらく質素なマッチングですか?)

ただし、この場合、}}文字列内に別の文字があります。のような巧妙なことを行うことができます{{persondata((?:.*)}}(?:.*))}}が、一般に、再帰構造(それ自体をネストする構造)に到達したらすぐに、正規表現を放棄して適切な構文解析ソリューションに目を向ける必要があります。

あなたは見たいかもしれませんpyparsing

于 2012-09-20T22:21:39.187 に答える
0

この目的のために作成されたPyPIのモジュールがあります。mwparserfromhellを参照してください。

于 2012-09-21T00:20:41.530 に答える