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。反斜杠不是必需的,因此为了便于阅读,我省略了它们。

聚苯乙烯。如果该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 回答