推广正则表达式以搜索维基百科类别

时间:2017-06-15 13:25:55

标签: python regex wikipedia

我有以下文本字符串(取自维基百科转储)

text = "[[Category:Ethnic groups| ]]\n[[Category:Ethnic groups by region|*]]\n[[Category:Society-related lists|Ethnic groups]]\n[[Category:Lists of ethnic groups]]"

我想提取文中的所有类别。所以基本上理想的输出应该是

text = "[Ethnic groups,Ethnic groups by region,Society-related lists|Ethnic groups,Lists of ethnic groups]"

这是我尝试获得解决方案

import re

categories = re.findall(r'\b(Category:.*)\b', text)

categories = [category.replace("Category:", "") for category in categories]

返回我想要的东西。但是,我不确定这是推广正则表达式的最佳方法。特别是,我想搜索" [[类别:"而不只是"类别:"因为这是类别链接的实际维基百科定义。您对我如何改进正则表达式有什么建议吗?

2 个答案:

答案 0 :(得分:1)

我会选择:

re.findall(r"\bCategory:(.*)\b", text)

应该只返回所需的值(由于括号)

答案 1 :(得分:1)

首先,您不需要进行研究,在替换后,您可以使用捕获组一步一步完成re.findall仅在模式包含捕获组时返回捕获组,否则它返回整个匹配)

寻找[[Category:代替\bCategory:可能是一个好主意。所有你需要做的就是逃避打开方括号,因为它们是特殊的正则表达式字符。

而不是.*\b你应该使用像(?:\|(?!\*)[^\]|]*)*)那样更严格的东西来排除结束的方括号和管道后面跟一个星号。但是,如果您确定要提取的数据以单词字符结尾并且每行只有一个.*\b,则使用[[Category:...]]也是一个好主意。一个很好的折衷方案是[^\]]*\b

所以一步到位:

categories = re.findall(r'\[\[Category:([^\]]*\b)', text)