当前位置:嗨网首页>书籍在线阅读

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\dfindall() 方法将返回一个匹配字符串的列表,例如 ['415-555-9999', '212-555-0000']
  • 如果在一个有分组的正则表达式上调用,例如 (\d\d\d)-(\d\d\d)- (\d\d\d\d)findall() 方法将返回一个字符串的元组的列表(每个分组对应一个字符串),例如 [('415', '555', '9999'), ('212', '555', '0000')]