2012-09-20 45 views
0

我試圖從字符串中獲取文本塊。我試圖使用方法:Python的正則表達式不工作從維基頁面提取信息

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() 

的字符串是:(是的,它的維基頁面)

*[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]] 

,但我一直沒有得到匹配。

+0

只是一對夫婦的風格的註釋:1)你可以刪除括號圍繞條件(Python'if'語句不需要它們,如第二個'if result:'所示),2)除非你真的想比較'self.isPerson'是否爲'True'並且沒有其他值,你應該簡單地使用'if self.isPerson:...',3)PEP 8 [推薦](http://www.python.org/dev/peps/pep-0008/#function-names)使用'find_person_info '和'self.is_person'命名約定,4)regexen通常用原始的'r'...'字符串指定,以避免反斜槓轉義問題。 –

+0

還有一件事:如果'self.isPerson'爲false,則不會設置局部變量'result'(因此會導致異常)。你是否打算把第二個「if」縮進一層? –

+0

@benhoyt - 感謝您的評論,我是python的新手,所以仍然學習所有的python風格約定。第二如果應該縮進一個級別:) – Justin808

回答

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() 
+0

比我預期的更多的信息。我從中學到了很多關於python正則表達式的知識。謝謝 – Justin808

相關問題