1

在以下程序输出中使用括号时为 ['www.google.com'].

import re
teststring = "href=\"www.google.com\""
m=re.findall('href="(.*?)"',teststring)
print m;

如果在 findall 函数中删除括号,则输出为['href="www.google.com"'].

import re
teststring = "href=\"www.google.com\""
m=re.findall('href=".*?"',teststring)
print m;

如果有人解释它是如何工作的,那将会很有帮助。

4

1 回答 1

5

re.findall()文档中的区别非常清楚:

返回字符串中模式的所有非重叠匹配,作为字符串列表。[...] 如果模式中存在一个或多个组,则返回组列表;如果模式有多个组,这将是一个元组列表。

因此.findall()返回一个包含三种类型值之一的列表,具体取决于模式中的组数:

  • 0 捕获模式中的组(无(...)括号):整个匹配的字符串('href="www.google.com"'在您的第二个示例中)。
  • 模式中的 1 个捕获组:返回捕获的组('www.google.com'在您的第一个示例中)。
  • 模式中超过 1 个捕获组:返回所有匹配组的元组。

(?:...)如果您不想要这种行为,请使用非捕获组 ( ),如果您想了解更多信息,请添加组。例如,在href=部件周围添加一个组将导致一个元组列表,每个元组有两个元素:

>>> re.findall('(href=)"(.*?)"', teststring)
[('href=', 'www.google.com')]
于 2013-01-22T11:38:33.187 回答