0

文字列からテキストのブロックを取得しようとしています。私が使おうとしているのは:

def findPersonInfo(self):
    if (self.isPerson == True):
        regex = re.compile("\{\{persondata(.*)\}\}",re.IGNORECASE|re.MULTILINE|re.UNICODE)
        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]]

しかし、私は一致しません。

4

1 に答える 1

2

re.DOTALL正規表現オプションに追加します。

In [193]: regex = re.compile(r"{{persondata(.*)}}",re.IGNORECASE|re.MULTILINE|re.UNICODE|re.DOTALL)

In [194]: regex.search(text).group()
Out[194]: '{{Persondata\n|NAME= Acaba, Joseph Michael "Joe"\n|ALTERNATIVE NAMES=\n|SHORT DESCRIPTION=[[Hydrogeologist]]\n|DATE OF BIRTH={{Birth date and age|1967|5|17}}\n|PLACE OF BIRTH=[[Inglewood, California]]\n|DATE OF DEATH=\n|PLACE OF DEATH=\n}}\n{{DEFAULTSORT:Acaba, Joseph M.}}'

DOTALL.改行を含むすべての文字に一致させます。(なしDOTALLでは、.改行とは一致しません。)

MULTILINE^行の先頭と文字列の先頭に一致させ、行の末尾と文字列の$末尾に一致させます。それは大丈夫ですが、ここでの試合には影響しません。

PS。バックスラッシュは必要ないので、読みやすくするために省略しました。

PPS。findPersonInfoメソッドが頻繁に呼び出される場合は、メソッドre.compileに依存しないため、メソッドからの呼び出しを解除することをお勧めしselfます。

class Foo:
    info_pat = re.compile("{{persondata(.*)}}",
                                  re.IGNORECASE|re.MULTILINE|re.UNICODE)
    def findPersonInfo(self):
        result = None
        if self.isPerson:
            result = self.info_pat.search(self._rawPage)
        if result:
            print 'Match found: ', result.group()
于 2012-09-20T22:07:45.753 に答える