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

2024-05-15 22:47:02 发布

您现在位置:Python中文网/ 问答频道 /正文

如果我有一个像这样的字符串:

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

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


Tags: 字符串列表类别politicalcategorycultureideologies
3条回答

要进一步解释Avinash在他的answer中使用的regex:

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

  • Category:匹配文本“Category:”
  • (...)是一个捕获组,大致意思是“这个组中的表达式是我要提取的块”
  • [^...]是一个否定集,意思是“不匹配此集中的任何字符”。在
  • \[和{}分别匹配文本中的“[”和“]”。在
  • *表示“匹配前面的正则表达式定义的项中的零个或多个”

在这里,我使用...来表示我删除了一些对解释不重要的字符。在

因此,将所有这些放在一起,regex会这样做:

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

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

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)

输出:

^{2}$

好像你想要这样的东西

>>> 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中存在的字符。在

相关问题 更多 >