详解Python re.finditer.groupdict函数:返回所有有命名的匹配的字典

  • Post category:Python

re 模块是 Python 中用来操作正则表达式的库。其中,re.finditer() 是一个函数,用于在字符串中查找并迭代所有匹配的结果。re.finditer().groupdict() 是 re.finditer() 函数的变体,它把每个匹配数据封装到一个 Python 字典中,提供更方便的访问方式。下面是该函数的详细攻略:

re.finditer() 函数

作用

用于在字符串中查找所有匹配的结果,并将每个匹配数据返回给调用者。

语法

re.finditer(pattern, string, flags=0)

其中,

  • pattern 表示正则表达式模式,用于匹配字符串。
  • string 表示要搜索的字符串。
  • flags 是可选参数,用于指定正则表达式的匹配模式。

返回值

re.finditer() 返回一个迭代器对象,该迭代器对象可以用来迭代所有匹配模式的结果。每次迭代返回一个包含匹配数据的 MatchObject 对象,其中包含以下属性和方法:

  • group() 返回匹配到的字符串。
  • start() 返回匹配字符串的开始位置。
  • end() 返回匹配字符串的结束位置。
  • span() 返回匹配字符串的开始和结束位置,以元组的形式返回。

实例1:

假设需要匹配字符串中所有数字的出现位置,代码如下:

import re

s = "apple1234orange5678pear9012"
pattern = "\\d+"
iter = re.finditer(pattern, s)
for match in iter:
    print(match.group(), match.start(), match.end())

输出结果如下:

1234 5 9
5678 12 16
9012 20 24

实例2:

假设需要匹配字符串中所有单词的出现位置,代码如下:

import re

s = "The quick brown fox jumps over the lazy dog."
pattern = "\\w+"
iter = re.finditer(pattern, s)
for match in iter:
    print(match.group(), match.start(), match.end())

输出结果如下:

The 0 3
quick 4 9
brown 10 15
fox 16 19
jumps 20 25
over 26 30
the 31 34
lazy 35 39
dog 40 43

re.finditer().groupdict() 函数

作用

将 re.finditer() 函数的返回值转换为 Python 字典,方便使用。

语法

re.finditer(pattern, string, flags=0).groupdict(default=None)

其中,

  • pattern 表示正则表达式模式,用于匹配字符串。
  • string 表示要搜索的字符串。
  • flags 是可选参数,用于指定正则表达式的匹配模式。
  • default 是可选参数,用于指定没有匹配到结果时的默认字典项。

返回值

返回一个字典,其中字典的每个键表示匹配数据的名称(如正则表达式中的命名组),键对应的值就是该匹配项的值。

实例1:

假设需要匹配邮件地址中的用户名和域名,代码如下:

import re

s = "abc123@gmail.com, 456def@yahoo.com"
pattern = "(?P<user>\\w+)@(?P<domain>\\w+\\.\\w+)"
for match in re.finditer(pattern, s):
    print(match.groupdict())

输出结果如下:

{'user': 'abc123', 'domain': 'gmail.com'}
{'user': '456def', 'domain': 'yahoo.com'}

实例2:

假设需要匹配超链接中的文本和 URL,代码如下:

import re

s = '<a href="http://www.baidu.com">百度</a>, <a href="http://www.google.com">谷歌</a>'
pattern = '<a href="(?P<url>.*?)">(?P<text>.*?)</a>'
for match in re.finditer(pattern, s):
    print(match.groupdict())

输出结果如下:

{'url': 'http://www.baidu.com', 'text': '百度'}
{'url': 'http://www.google.com', 'text': '谷歌'}