python - 泛化正则表达式以搜索维基百科类别

标签 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]

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

最佳答案

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

寻找 [[Category: 而不是 \bCategory: 可能是个好主意。您所要做的就是转义左方括号,因为它们是特殊的正则表达式字符。

您应该使用更具限制性的内容,例如 (?:\|(?!\*)[^\]|]*)*),而不是 .*\b 不包括右方括号和后跟星号的管道。但是,如果您确定要提取的数据以单词字符结尾并且只有一个 [[Category:... ]] 每行。一个好的折衷方案是 [^\]]*\b

一步一步:

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

关于python - 泛化正则表达式以搜索维基百科类别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44568784/

相关文章:

python - 在 Python 中使用 map 函数迭代字典列表中的值

python - 如何在SASOPTPY中定义常量

python - 在 flask 迁移或 alembic 迁移中创建种子数据

c# - 正则表达式至少有 1 个字符和 1 个数字

python - Django正则表达式匹配长url

regex - 如何使用正则表达式提取子字符串?

python - PyQt5:QTableWidget 中复选框的状态更改

wikipedia - 如何仅使用页面链接找到维基百科页面的类别?

wikipedia - 从维基百科中提取故事情节

java - 人名消歧