一. 使用正则表达式查找文本模式

1
2
# 字符串
regex_str = "1. wubba lubba dub dubs. 2. Hey, what are you in for? - Everyting. 3. Homework is stupid, the whole point is to get less of it."

1、正则操作步骤

  • 基础流程如下
    1
    2
    3
    4
    5
    6
    import re
    regex = re.compile('\d') # 正则表达式
    result = regex.search(regex_str) # 查找
    print(result.group()) # 返回结果

    # 运行结果: 1
  • 流程解析
    1. 导入re模块
    2. 传入正则表达式,返回值为regex对象。
    3. 使用regex对象方法(search)查找匹配正则表达式, 返回Match对象
    4. 使用Match对象的方法(group)获取匹配的值。
  • 知识点 01 字符替换
    1. \d: 表示一个数字 0~9
    2. \w: 表示一个下划线、数字、或字母
    3. \s: 表示一个空格、制表、换行

2、分组

  • 代码演示
    1
    2
    3
    4
    5
    6
    7
    8
    9
    import re
    regex = re.compile("(\d).*(\d).*(\d)") # 分三组
    result = regex.search(regex_str)
    print(result.group())
    # 运行结果:1. wubba lubba dub dubs. Hey, 2. what are you in for? - Everyting. 3
    print(result.group(1)) # 打印匹配到的第一组的值
    # 运行结果: 1
    print(result.groups()) # 打印匹配到的所有组的值
    # 运行结果:('1', '2', '3')
    - 知识点 2 括号
  1. 第一个括号内的表达式为第一组,可使用group(1)取值
  2. groups() 获取所有分组。

3、字符

  • 代码演示
    1
    2
    3
    4
    5
    6
    7
    import re
    regex = re.compile("(b){2}") # 分三组
    result = regex.search(regex_str)
    print(result.group())
    # 运行结果: bb
    print(result.groups())
    # 运行结果: ('b',)
    - 知识点 3 贪心匹配
  1. (){N} 表示匹配括号内表达式 N次。
  2. (){1,3} 优先匹配3次
  3. (){1,} 优先配对最大值(max)
  4. (){,2} 优先配对2次,(找不到值则返回为None)
  5. (){1,3}? 非贪心匹配

4、通配符

  1. +: 加号表示匹配一次或多次。
  2. *: 星号表示匹配零次或多次。
  3. ?: 问号表示匹配零次或一次。
  4. .: 表示任意一个字符,非换行符之外的所有字符
  5. ^a:表示以a开头的字符。
  6. $a: 表示以a结尾的字符。
  7. {N}: 表示匹配次数。
  8. [auc]: 表示单字符选择范围(a u c)
  9. [^auc]:表示单字符选择范围(除a u c外字符)

5、扩展

  • 代码演示,compile 参数

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    import os

    regex = re.compile(".*", re.DOTALL) # 匹配所有字符,包括换行符

    regex = re.compile("aAsA", re.IGNORECASE) # 不区分大小写

    regex = re.compile('''(wubba).* # 注释
    (dub) # 注释''', re.VERBOSE)
    result = regex.search(regex_str)
    #运行结果: wubba lubbba dub dub
    print(result.group())

  • 代码演示, re 基础方法

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    import os

    regex = re.compile("(\d)(bb)")
    regex.sub("www", "111bbbb, 111")
    #运行结果: 11wwwbb, 111

    regex.sub("\2***", "111bbbb, 111")
    #运行结果: 11***bb, 111

    result = re.match("\w\d\w", "111 11111 111")
    print(result.group())
    #运行结果: 111