泛化正则表达式以搜索维基百科类别
Generalize regex to search for Wikipedia Categories
我有以下文本字符串(取自维基百科转储)
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]
哪个 returns 我想要什么。但是,我不确定这是概括正则表达式的最佳方式。特别是,我想搜索“[[Category:”而不仅仅是 "Category:",因为这是类别链接的实际维基百科定义。您对我如何改进正则表达式有什么建议吗?
我会选择:
re.findall(r"\bCategory:(.*)\b", text)
这应该 return 只有需要的值(多亏了括号)
首先,您不需要进行研究,替换后,您可以使用捕获组一步完成 (re.findall
returns 仅捕获当模式包含捕获组时分组,否则 returns 整个匹配).
寻找 [[Category:
而不是 \bCategory:
可能是个好主意。您所要做的就是避开左方括号,因为它们是特殊的正则表达式字符。
而不是 .*\b
你应该使用更严格的东西,比如 (?:\|(?!\*)[^\]|]*)*)
排除右方括号和后跟星号的竖线。但是,如果您确定要提取的数据以单词字符结尾并且每行只有一个 [[Category:...]]
,那么使用 .*\b
也是一个好主意。一个好的折衷方案是 [^\]]*\b
所以一步到位:
categories = re.findall(r'\[\[Category:([^\]]*\b)', text)
我有以下文本字符串(取自维基百科转储)
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]
哪个 returns 我想要什么。但是,我不确定这是概括正则表达式的最佳方式。特别是,我想搜索“[[Category:”而不仅仅是 "Category:",因为这是类别链接的实际维基百科定义。您对我如何改进正则表达式有什么建议吗?
我会选择:
re.findall(r"\bCategory:(.*)\b", text)
这应该 return 只有需要的值(多亏了括号)
首先,您不需要进行研究,替换后,您可以使用捕获组一步完成 (re.findall
returns 仅捕获当模式包含捕获组时分组,否则 returns 整个匹配).
寻找 [[Category:
而不是 \bCategory:
可能是个好主意。您所要做的就是避开左方括号,因为它们是特殊的正则表达式字符。
而不是 .*\b
你应该使用更严格的东西,比如 (?:\|(?!\*)[^\]|]*)*)
排除右方括号和后跟星号的竖线。但是,如果您确定要提取的数据以单词字符结尾并且每行只有一个 [[Category:...]]
,那么使用 .*\b
也是一个好主意。一个好的折衷方案是 [^\]]*\b
所以一步到位:
categories = re.findall(r'\[\[Category:([^\]]*\b)', text)