2017-06-15 15 views
1

我有文字的下面的字符串(從維基百科轉儲)期廣義正則表達式來搜索維基百科分類

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] 

返回我想要的嘗試。但是,我不確定這是推廣正則表達式的最佳方式。特別是,我想搜索「[[Category:」而不是「Category:」,因爲這是維基百科對類別鏈接的定義。你對如何提高我的正則表達有什麼建議嗎?

回答

1

首先,你並不需要做一個研究和置換後,你可以使用捕獲組一步完成re.findall只返回捕獲組,當模式包含捕獲組時,否則返回整個匹配)

尋找[[Category:而不是\bCategory:可能是一個好主意。所有你需要做的就是跳過方括號,因爲它們是特殊的正則表達式字符。

而不是.*\b你應該使用更多限制性的東西,如(?:\|(?!\*)[^\]|]*)*),排除方括號和管後面帶星號的管道。但是如果您確定要提取的數據以單詞字符結尾並且每行只有一個[[Category:...]],則使用.*\b也是一個好主意。一個很好的妥協將是[^\]]*\b

所以一步到位:

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

我會去的:

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

至極應該只返回所需的值(感謝括號)