15-findall()方法
7.5 findall()方法
除了 search()
方法, Regex
对象还有一个 findall()
方法。 search()
方法将返回一个 Match
对象,包含被查找字符串中的“第一次”匹配的文本;而 findall()
方法将返回一组字符串,包含被查找字符串中的“所有”匹配文本。为了验证 search()
方法返回的 Match
对象只包含第一次出现的匹配文本,请在交互式环境中输入以下代码:
>>> phoneNumRegex = re.compile(r'\d\d\d-\d\d\d-\d\d\d\d')
>>> mo = phoneNumRegex.search('Cell: 415-555-9999 Work: 212-555-0000')
>>> mo.group()
'415-555-9999'
另一方面, findall()
方法不是返回一个 Match
对象,而是返回一个字符串列表,条件是在正则表达式中没有分组。列表中的每个字符串都是一段被查找的文本,它匹配该正则表达式。在交互式环境中输入以下代码:
>>> phoneNumRegex = re.compile(r'\d\d\d-\d\d\d-\d\d\d\d') # has no groups
>>> phoneNumRegex.findall('Cell: 415-555-9999 Work: 212-555-0000')
['415-555-9999', '212-555-0000']
如果在正则表达式中有分组,那么 findall()
方法将返回元组的列表。每个元组表示一个找到的匹配,其中的项就是正则表达式中每个分组的匹配字符串。为了查看 findall()
方法的效果,请在交互式环境中输入以下代码(请注意,被编译的正则表达式现在有括号分组):
>>> phoneNumRegex = re.compile(r'(\d\d\d)-(\d\d\d)-(\d\d\d\d)') # has groups
>>> phoneNumRegex.findall('Cell: 415-555-9999 Work: 212-555-0000')
[('415', '555', '9999'), ('212', '555', '0000')]
作为 findall()
方法的返回结果的总结,请记住下面两点。
- 如果在一个没有分组的正则表达式上调用,例如
\d\d\d-\d\d\d-\d\d\d\d
,findall()
方法将返回一个匹配字符串的列表,例如['415-555-9999', '212-555-0000']
。 - 如果在一个有分组的正则表达式上调用,例如
(\d\d\d)-(\d\d\d)- (\d\d\d\d)
,findall()
方法将返回一个字符串的元组的列表(每个分组对应一个字符串),例如[('415', '555', '9999'), ('212', '555', '0000')]
。