在Python中提取双方括号之间的文本

在Python中提取双方括号之间的文本,python,regex,Python,Regex,如果我有一个如下所示的字符串: "[[Category:Political culture]]\n\n [[Category:Political ideologies]]\n\n" 如何提取类别并将其放入列表中? 我很难让正则表达式正常工作。似乎您想要这样的东西 >>> str = "[[Category:Political culture]]\n\n [[Category:Political ideologies]]\n\n" >&

如果我有一个如下所示的字符串:

"[[Category:Political culture]]\n\n          [[Category:Political ideologies]]\n\n"
如何提取类别并将其放入列表中?
我很难让正则表达式正常工作。

似乎您想要这样的东西

>>> 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
函数将返回列表中的匹配项。因此在我们的例子中,这个
类别:
匹配字符串
类别:
,这个
([^\[\]]*)
将捕获任何字符,但不会捕获
[
]
的零次或多次。现在,findall函数将返回组索引1中的字符。

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']

要进一步解释Avinash在其著作中使用的正则表达式,请执行以下操作:

类别:([^\[\]]*)
由几个部分组成:

  • Category:
    与文本“Category:
  • (…)
    是一个捕获组,大致意思是“此组中的表达式是我要提取的块”
  • [^…]
    是一个否定集,表示“不匹配此集中的任何字符”
  • \[
    \]
    分别匹配文本中的“[”和“]”
  • *
    表示“匹配零个或多个前面的正则表达式定义项”
我用
表示我删除了一些对解释不重要的字符

因此,把所有这些放在一起,正则表达式可以做到:

查找“Category:”,然后匹配其后不是排除字符“[”或“]”的任何数字(包括零)。当它遇到一个排除的字符时,它将停止,并返回与
(…)
部分中的正则表达式匹配的文本。因此,正则表达式实际上并不像您预期的那样查找“[[”或“]]”,因此即使它们被忽略,也会匹配。您可以通过将其更改为
\[\[Category:([^\[\]*)\]\]\]
来强制它在开始和结束处查找双方括号


对于第二个正则表达式,
Category:[^\[\]]*
,捕获组
(…)
被排除在外,因此Python返回所有匹配的内容,包括“Category:”。

到目前为止您得到了什么?这非常有效。但我有一个问题:为什么“类别”在方括号之前?它不应该出现在两者之间吗?你能提供一个复制上述内容的例子吗?不,它正在工作,我只是想:你能给我解释一下正则表达式吗,因为我真的不明白它是如何工作的:)你是指第一个吗?是的,当然。我不明白的是为什么“Category”这个词首先出现在正则表达式中。它不应该出现在中间:“([^[类别:]]”?