2013-10-23 42 views
1

我試圖從維基百科文章中提取語言列表:List_of_programming_languages_by_type。有幾行字:維基百科鏈接與正則表達式解析

  • [阿達(編程語言)|阿達](多用途語言)
  • [Afnix(編程語言)| Afnix] –對數據的併發訪問自動保護(以前稱爲'阿萊夫',但無關 '' Alef的 '')
  • [Cilk的] –併發[C(編程語言)| C]

幾乎所有人除了包含多個[[]]塊的行(示例中帶有Click語言的行)之外,l行被正確解析。解析代碼:

for line in lines: 
    lang = re.search('^\*+\s*(\[\[' 
        '((?P<wiki_link>.+?)(\|))?' 
        '(?P<lang_name>.+?)' 
        '\]\])', line) 
    if lang: 
     print lang.groupdict() 

輸出:

{'wiki_link': u'Ada (programming language)', 'lang_name': u'Ada'} 
{'wiki_link': u'Afnix (programming language)', 'lang_name': u'Afnix'} 
{'wiki_link': u'Cilk]] &ndash; a concurrent [[C (programming language)', 'lang_name': u'C'} 

我怎麼能在一個在線多[[]]塊管理?

P.S.預期結果:

{'wiki_link': None, 'lang_name': u'Clik'} 
+0

爲什麼使用普通正則表達式而不是維基標記解析器? –

+0

你的預期結果是什麼? – juliomalegria

+1

馬特,這只是出於教育原因:) –

回答

1

就快:

lang = re.search('^\*+\s*(\[\[' 
       '((?P<wiki_link>[^]]+?)(\|))?' 
       '(?P<lang_name>.+?)' 
       '\]\])', line) 

只要改變(?P<wiki_link>.+?)(?P<wiki_link>[^]]+?)

它不會匹配嵌套結構。

>>> print lang.groupdict() 
{'wiki_link': None, 'lang_name': 'Cilk'}