目录
  1. 1. 正则表达式
    1. 1.1. 贪婪模式与非贪婪模式
      1. 1.1.1. 贪婪模式
      2. 1.1.2. 非贪婪模式
    2. 1.2. 正则表达式分组
    3. 1.3. 捕获组和非捕获组(命名组和非命名组)
Python3实战演练-正则表达式2

正则表达式

贪婪模式与非贪婪模式

贪婪模式

正则表达式尽可能多的去向后匹配,满足的有:* + {m,n} ?

1
print(re.findall("ab*", "abbbbbbbbbbbbbbbbbbbb"))

上述输出结果为:

1
['abbbbbbbbbbbbbbbbbbbb']

非贪婪模式

正则表达式尽可能少的去向后匹配
贪婪->非贪婪 后面加?即可 如:*? +? {m,n}? ??

1
print(re.findall("ab*?", "abbbbbbbbbbbbbbbbbbbb"))

上述输出结果为:

1
['a']

正则表达式分组

使用()可以为正则表达式建立一个子组,子组可以看作内部的整体
如:abcd(ef) –> abcdef

  1. 增加子组后对正则表达式整体的匹配没有影响
  2. 子组可以改变重复元字符的重复行为
  3. 子组在某些操作中可以对子组匹配内容进行单独提取
1
2
3
# 子组匹配
# 如 匹配(ab)整体
print(re.findall("((ab)+)", "abababababcccc"))

上述输出结果为:

1
[('ababababab', 'ab')]
1
2
3
4
5
6
# 子组在某些操作中可以对子组匹配内容进行单独提取
obj = re.search("a(bc)d(ef)", "abcdef")
print(obj.group())
print(obj.group(0))
print(obj.group(1))
print(obj.group(2))

上述输出结果为:

1
2
3
4
abcdef
abcdef
bc
ef

子组的注意事项:

  1. 每个正则表达式可以有多个子组,由外到内,由左到右分别为第1、第2、第3…子组
  2. 子组通常不要交叉,如: a(bc(d)e)f

捕获组和非捕获组(命名组和非命名组)

给子组赋予了名字,即起名字。
子组命名格式:
(?P<name>abc123)

  1. 编程接口可以通过名字获取子组匹配内容。
  2. 捕获组中的正则表达式可以通过名字重复调用。
  3. 调用方式:(?P=name)
    如:
    1
    print(re.search("(?P<dog>saisai)123(?P=dog)", "saisai123saisai999").group())

上述输出结果为:

1
saisai123saisai

其中,(?P<dog>saisai)表示 dog = saisai (?P<dog>saisai)123(?P=dog)表示 saisai123saisai

文章作者: 李浩
文章链接: https://leehoward.cn/2020/03/08/Python3实战演练-正则表达式2/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 leehoward
打赏
  • 微信
  • 支付宝

评论