1

我正在尝试从维基百科文章中提取语言列表:List_of_programming_languages_by_type。有几行:

  • [[Ada(编程语言)|Ada]](多用途语言)
  • [[Afnix (programming language)|Afnix]] – 自动保护并发访问数据(以前称为“Aleph”,但与“Alef”无关)
  • [[Cilk]] – 并发 [[C (programming language)|C]]

几乎所有行都被正确解析,除了带有多个 [[ ]] 块的行(示例中带有 Click 语言的行)。解析代码:

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'}

如何在一行中管理多个 [[ ]] 块?

PS预期结果:

{'wiki_link': None, 'lang_name': u'Clik'}
4

1 回答 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'}
于 2013-10-23T15:26:38.613 回答