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

时间:2014-11-25 13:33:38

标签: python regex

如果我的字符串可能如下所示:

"[[Category:Political culture]]\n\n          [[Category:Political ideologies]]\n\n"

如何提取类别并将其放入列表中? 我很难让正则表达式起作用。

3 个答案:

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