Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 正则表达式从wikipedia页面提取节_Regex - Fatal编程技术网

Regex 正则表达式从wikipedia页面提取节

Regex 正则表达式从wikipedia页面提取节,regex,Regex,我正在尝试解析wikipedia页面,需要使用正则表达式提取页面的特定部分。在下面的数据中,我只需要提取{{Infobox…}}节中的数据 {{Infobox XC Championships |Name = Senior men's race at the 2008 IAAF World Cross Country Championships |Host city = [[Edinburgh]], [[Scotland]], [[United Kingdom]] {{flagic

我正在尝试解析wikipedia页面,需要使用正则表达式提取页面的特定部分。在下面的数据中,我只需要提取{{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[^{}]*\\}\\} 

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

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

1> 将
计数器初始化为
0

2> 当您找到
{{

3> 当您找到
}


4> 重复第2步和第3步,直到计数器为0。不要使用正则表达式。遵循此算法

1> 将
计数器初始化为
0

2> 当您找到
{{

3> 当您找到
}


4> 重复第2步和第3步,直到计数器为0为止。由于信息框部分的格式设置,实际上可以使用正则表达式进行此操作。
诀窍是,您甚至不关心嵌套的
{{…}
元素,因为每个元素都在自己的行中,以
|
开头

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

因此,在
信息框
-部分中,您只需匹配以
|
开头的行,直到弹出
}


根据您的平台/语言,您可能必须尝试使用
\r\n
。可以使用
\r\n
,但只能在
\n

上匹配,因为信息框部分的格式设置,实际上可以为此使用正则表达式。
诀窍是,您甚至不关心嵌套的
{{…}
元素,因为每个元素都在自己的行中,以
|
开头

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

因此,在
信息框
-部分中,您只需匹配以
|
开头的行,直到弹出
}


根据您的平台/语言,您可能必须尝试使用
\r\n
。对
\r\n
没有问题,但只在
\n

上匹配。Regex不是为处理嵌套而设计的。谢谢@Amber。你能给我建议最好的方法吗?一种方法是迭代字符串,计算开始大括号的数量,当你经过相等数量的结束大括号时停止。如果你担心性能,正则表达式几乎永远解决不了你的问题。正则表达式是解决某些问题的一种简单、方便的方法,但通常因性能差而臭名昭著。请注意,“这种蛮力方法”在处理的数据量方面实际上与正则表达式没有任何区别……正则表达式不是为处理嵌套而设计的。谢谢@Amber。你能给我建议最好的方法吗?一种方法是迭代字符串,计算开始大括号的数量,当你经过相等数量的结束大括号时停止。如果你担心性能,正则表达式几乎永远解决不了你的问题。正则表达式是解决某些问题的一种简单、方便的方法,但通常因性能差而臭名昭著。请注意,“这种蛮力方法”实际上与正则表达式所处理的数据量没有任何区别……我不知道在infobox部分的每一行的开头都必须有一个|。谢谢。它似乎起作用了:)@Kailash老实说,我不知道是否必须有一个
,因为我不知道维基百科使用的语法。但在您发布的示例中,我觉得它像是模式的一部分。我不知道在infobox部分的每一行的开头都必须有一个|。谢谢。它似乎起作用了:)@Kailash老实说,我不知道是否必须有一个
,因为我不知道维基百科使用的语法。但在您发布的示例中,我认为它是模式的一部分。