Python3实战演练-正则表达式2

正则表达式

贪婪模式与非贪婪模式

贪婪模式

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

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

上述输出结果为:

1
['abbbbbbbbbbbbbbbbbbbb']
SCHEME

非贪婪模式

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

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

上述输出结果为:

1
['a']
SCHEME

正则表达式分组

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

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

上述输出结果为:

1
[('ababababab', 'ab')]
SCHEME
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))
PYTHON

上述输出结果为:

1
2
3
4
abcdef
abcdef
bc
ef
EBNF

子组的注意事项:

  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())
    PYTHON
    上述输出结果为:
    1
    saisai123saisai
    TEXT
    其中,(?P<dog>saisai)表示 dog = saisai (?P<dog>saisai)123(?P=dog)表示 saisai123saisai

Python3实战演练-正则表达式2
https://leehoward.cn/2020/03/08/Python3实战演练-正则表达式2/
作者
lihao
发布于
2020年3月8日
许可协议