Регулярное выражение для извлечения раздела со страницы википедии

Я пытаюсь разобрать страницу википедии и мне нужно извлечь определенный раздел страницы с помощью регулярных выражений. В приведенных ниже данных мне просто нужно извлечь данные в разделе {{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 ответа

Решение

Из-за форматирования раздела infobox для этого можно использовать регулярное выражение.
Хитрость в том, что ты даже не заботишься о вложенных {{...}} элементы, так как каждый из них будет в своей строке, начиная с |,

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

Визуализация регулярных выражений

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 в зависимости от вашей платформы / языка. Debuggex был в порядке с \r\n, но http://regex101.com/r/kH8lX3 будет соответствовать только на \n

Не используйте регулярные выражения. Следуйте этому алгоритму

1>Initialize counter в 0

2>Increment counter когда вы найдете {{

3>Decrement counter когда вы найдете }}

4> Повторяйте шаги 2 и 3, пока счетчик не станет равным 0

Другие вопросы по тегам