如果我的字符串可能如下所示:
"[[Category:Political culture]]\n\n [[Category:Political ideologies]]\n\n"
如何提取类别并将其放入列表中? 我很难让正则表达式起作用。
答案 0 :(得分:2)
扩展Avinash在answer中使用的正则表达式的解释:
Category:([^\[\]]*)
由几部分组成:
Category:
与文字“Category:”(...)
是一个捕获组,大致意思是“此组中的表达式是我要提取的块”[^...]
是一个否定的集合,表示“不匹配此集合中的任何字符”。\[
和\]
分别与文本中的“[”和“]”匹配。*
表示“匹配零个或多个前面的正则表达式定义的项目”我使用...
表示我删除了一些对解释不重要的字符。
所以把它们放在一起,正则表达式就是这样做的:
查找“类别:”,然后匹配之后不是排除字符“[”或“]”的任何数字(包括零)字符。当它遇到排除的字符时,它会停止,并返回(...)
部分内的正则表达式匹配的文本。因此,正则表达式实际上并不像您期望的那样寻找“[[”或“]]”,因此即使它们被遗漏也会匹配。您可以强制它在开头和结尾处查找双方括号,方法是将其更改为\[\[Category:([^\[\]]*)\]\]
。
对于第二个正则表达式Category:[^\[\]]*
,捕获组(...)
被排除,因此Python返回匹配的所有内容,包括“Category:”。
答案 1 :(得分:1)
好像你想要这样的东西,
>>> str = "[[Category:Political culture]]\n\n [[Category:Political ideologies]]\n\n"
>>> re.findall(r'Category:([^\[\]]*)', str)
['Political culture', 'Political ideologies']
>>> re.findall(r'Category:[^\[\]]*', str)
['Category:Political culture', 'Category:Political ideologies']
默认情况下,re.findall
将仅打印与捕获组内存在的模式匹配的字符串。如果没有捕获组,则只有findall
函数会返回列表中的匹配项。因此,在我们的示例中,此Category:
匹配字符串category:
,此([^\[\]]*)
将捕获任何字符,但不会捕获[
或]
零次或多次。现在,findall函数将返回组索引1中存在的字符。
答案 2 :(得分:0)
Python代码:
s = "[[Category:Political culture]]\n\n [[Category:Political ideologies]]\n\n"
cats = [line.strip().strip("[").strip("]") for line in s.splitlines() if line]
print(cats)
输出:
['Category:Political culture', 'Category:Political ideologies']