2013-10-23 45 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'}