正则表达式从维基百科页面中提取一个部分

时间:2013-11-18 06:57:48

标签: regex

我正在尝试解析维基百科页面,需要使用正则表达式提取页面的特定部分。在下面的数据中,我只需要在{{Infobox ...}}部分中提取数据。

{{Infobox XC Championships
|Name       = Senior men's race at the 2008 IAAF World Cross Country Championships
|Host city  = [[Edinburgh]], [[Scotland]], [[United Kingdom]] {{flagicon|United Kingdom}}
|Location   = [[Holyrood Park]]
|Nations participating  = 45
}}
2008.<ref name=iaaf_00>
{{ Citation 
| last = 
| publisher = [[IAAF]]
}}

所以在上面的例子中,我只需要提取

Infobox XC Championships
|Name       = Senior men's race at the 2008 IAAF World Cross Country Championships
|Host city  = [[Edinburgh]], [[Scotland]], [[United Kingdom]] {{flagicon|United Kingdom}}
|Location   = [[Holyrood Park]]
|Nations participating  = 45

请注意{{Infobox ...}}部分中可能有嵌套的{{}}个字符。我不想忽略它。

以下是我的正则表达式:

\\{\\{Infobox[^{}]*\\}\\} 

但它似乎不起作用。请帮忙。谢谢!

2 个答案:

答案 0 :(得分:4)

由于信息框部分的格式化,实际上可以使用正则表达式。
诀窍是,您甚至不会处理嵌套的{{...}}元素,因为每个元素都将以|开头。

{{(Infobox.*\r\n(?:\|.*\r\n)+)}}

Regular expression visualization

Debuggex Demo

{{           start of the string
  (Infobox   start of the capturing group
  .*\r\n     any characters until a line break appears
  (?:        
    \|       line has to start with a |
    .*\r\n   any characters until a line break appears
  )          
  +          the non-capturing group can occur multiple times
  )          end of capturing group
}}           

因此,在Infobox - 部分内,您只需匹配以|开头的行,直到}}弹出。

您可能需要尝试使用\r\n,具体取决于您的平台/语言。 \r\n\n一样正常,但Debuggex仅匹配{{1}}

答案 1 :(得分:0)

不要使用正则表达式。遵循此算法

1>将counter初始化为0

当您找到counter

时,

2>增加{{

3>找到counter

后减少}}

4>重复步骤2和3,直到计数器为0