Skip to content

正则表达式是什么 ​

正则表达式(Regular Expression)是一种用特定语法规则组成的字符串模式,用来描述、匹配或替换文本中符合某种规则的字符序列。

可以理解为:专门用于文本处理的"高级查找和匹配公式"。

比如"匹配一个手机号"的规则就是 1[3-9]\d{9}——1 开头、第二位是 3-9、后面再跟 9 个数字。

re 模块的三个函数 ​

python
import re

s = "我的手机号是18809091231你记住了吗? 我的另一个手机号是18800001266,QQ号是1779989922你记住了吗?"

# match - 从字符串的开头开始匹配(返回 Match 对象)
result = re.match(r"1[3-9]\d{9}", s)
print(result)        # s 以"我"开头,不是手机号 → None

# search - 从任意位置开始, 搜索第一个匹配项(返回 Match 对象)
result = re.search(r"1[3-9]\d{9}", s)
print(result.group())    # 18809091231

# findall - 从任意位置开始, 搜索所有匹配项(返回 list)
result = re.findall(r"1[3-9]\d{9}", s)
print(result)            # ['18809091231', '18800001266']
函数从哪里找找到几个返回
re.match(规则, 文本)只从开头匹配第 1 个Match 对象(匹配不到是 None)
re.search(规则, 文本)任意位置第 1 个Match 对象
re.findall(规则, 文本)任意位置所有列表

Match 对象的常用方法 ​

python
result = re.search(r"1[3-9]\d{9}", s)
result.group()    # 匹配到的结果:'18809091231'
result.span()     # 匹配项的索引区间:(6, 17)
result.start()    # 开始索引
result.end()      # 结束索引

字符串前面的 r 是什么 ​

python
re.findall(r"1[3-9]\d{9}", s)

r 表示当前字符串中的转义字符无效,按普通字符串使用。正则表达式里大量使用 \d、\w 这类反斜杠,加 r 可以避免转义歧义——写正则统一加 r。

相关 ​

练习题 ​

一、知识回顾(读完直接做下面的实践题) ​

  1. 正则表达式是一种用特定语法规则组成的字符串模式,用来描述、匹配或替换文本中符合规则的字符序列
  2. 三个函数按"从哪里找"区分:match 从字符串开头开始;search 从任意位置找第 1 个;findall 找所有
  3. match 和 search 返回 Match 对象;findall 返回列表
  4. Match 对象取匹配结果用 group(),取索引区间用 span()
  5. 字符串前的 r 表示转义字符无效(按普通字符串使用),写正则时统一要加
  6. 匹配手机号的规则 1[3-9]\d{9} 的含义:1 开头、第二位是 3-9、后面跟 9 个数字

二、裸写题 ​

文本:s = "我的手机号是18809090000, 另一个手机号是18800008888,QQ号是155998992 和 18809091293821"

  • - 提示(先自己想,实在想不出再点开)

    一级 · 思路:两个函数的"起点"不同 二级 · 方法:re.match(规则, 文本) / re.search(规则, 文本)三级 · 骨架:print(re.match(r"1[3-9]\d{9}", s))

    - 参考答案(做完再点开)

    python
    import re
    
    s = "我的手机号是18809090000, 另一个手机号是18800008888,QQ号是155998992 和 18809091293821"
    
    # 2-1:match 从开头匹配,s 以"我"开头 → None;search 任意位置 → 找到
    print(re.match(r"1[3-9]\d{9}", s))     # None
    print(re.search(r"1[3-9]\d{9}", s).group())  # 18809090000
  • - 提示(先自己想,实在想不出再点开)

    一级 · 思路:要"全部",用三个函数里的哪一个? 二级 · 方法:re.findall(r"1[3-9]\d{9}", s)三级 · 骨架:print(re.____(r"1[3-9]\d{9}", s))

    - 参考答案(做完再点开)

    python
    import re
    
    s = "我的手机号是18809090000, 另一个手机号是18800008888,QQ号是155998992 和 18809091293821"
    
    # 2-2
    print(re.findall(r"1[3-9]\d{9}", s))   # ['18809090000', '18800008888']
    # QQ 号 155998992 不是 1 开头第二位 3-9 且共 11 位,所以不会被匹配
  • - 提示(先自己想,实在想不出再点开)

    一级 · 思路:Match 对象上有三个现成方法 二级 · 方法:group() / start() / end()三级 · 骨架:print(result.____(), result.____(), result.____())

    - 参考答案(做完再点开)

    python
    import re
    
    s = "我的手机号是18809090000, 另一个手机号是18800008888,QQ号是155998992 和 18809091293821"
    
    # 2-3
    result = re.search(r"1[3-9]\d{9}", s)
    print(result.group(), result.start(), result.end())