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