Python正则表达式校验字符串格式的完整指南

 更新时间:2026年07月14日 08:23:41   作者:detayun  
日常开发中大量场景需要校验字符串格式,本文主要介绍了Python如何使用re模块进行字符串格式校验的完整操作步骤,文中的示例代码讲解详细,感兴趣的小伙伴可以了解下

前言

日常开发中大量场景需要校验字符串格式:手机号、邮箱、身份证、密码、URL、日期、用户名等。如果使用字符串切片、循环判断实现校验,代码冗余且可读性差,正则表达式(re模块) 是Python处理格式校验最优方案。

本文从零讲解Python re 模块校验字符串的核心用法,包含基础语法、常用校验函数、实战通用正则模板,所有代码可直接复制运行。

一、Python正则基础模块介绍

Python内置re标准库,无需额外安装,导入即可使用:

import re

核心校验方法对比(格式检测专用)

方法作用适用场景
re.match(pattern, str)字符串开头匹配校验整体格式(必须从头符合规则)
re.fullmatch(pattern, str)完整字符串完全匹配字符串格式校验首选(推荐)
re.search(pattern, str)任意位置匹配子串查找是否包含指定内容,不适合完整格式校验

格式校验优先使用 re.fullmatch,只有整个字符串完全符合正则规则才返回匹配对象,否则返回None,逻辑最直观。

匹配对象判断规则

执行匹配后:

  • 有返回值(Match对象):格式正确
  • 返回None:格式错误
import re

res = re.fullmatch(r"\d+", "123456")
if res:
    print("格式合法")
else:
    print("格式错误")

二、正则基础元字符(校验必学)

写校验规则必须掌握基础符号:

  1. \d:数字 0-9;\D:非数字
  2. \w:字母/数字/下划线;\W:非单词字符
  3. \s:空白(空格、制表符);\S:非空白
  4. ^:字符串开头;$:字符串结尾(fullmatch可省略)
  5. {n}:固定n位;{n,m}:n~m位
  6. []:字符集,[0-9a-z]小写数字
  7. ():分组
  8. |:或
  9. .:任意字符(不含换行)
  10. *:0次及以上;+:1次及以上;?:0或1次

原始字符串 r"" 关键提醒

正则中大量反斜杠\,Python普通字符串会转义,正则表达式必须加前缀 r,避免转义冲突:

# 正确写法
pattern = r"\d{11}"
# 错误写法(需要双反斜杠,极易出错)
pattern = "\\d{11}"

三、通用封装:字符串格式校验工具函数

封装通用校验方法,项目中直接复用:

import re

def check_str_format(input_str: str, reg_pattern: str) -> bool:
    """
    正则校验字符串完整格式
    :param input_str: 待检测字符串
    :param reg_pattern: 正则表达式
    :return: 合法返回True,非法返回False
    """
    if not isinstance(input_str, str):
        return False
    match_result = re.fullmatch(reg_pattern, input_str)
    return match_result is not None

# 测试示例
if __name__ == "__main__":
    # 校验6位纯数字
    num_rule = r"\d{6}"
    print(check_str_format("123456", num_rule))  # True
    print(check_str_format("12345a", num_rule))  # False

四、高频业务场景正则校验实战

1. 手机号校验(国内11位)

规则:1开头,第二位3-9,后接9位数字

phone_rule = r"1[3-9]\d{9}"
print(check_str_format("13800138000", phone_rule))  # True
print(check_str_format("12800138000", phone_rule))  # False

2. 邮箱格式校验

通用邮箱规则:字母数字下划线@域名.后缀

email_rule = r"\w+@[a-zA-Z0-9]+\.[a-zA-Z]{2,}"
print(check_str_format("test123@qq.com", email_rule))  # True
print(check_str_format("test@.com", email_rule))       # False

3. 密码强度校验

需求:6-16位,必须包含数字+字母,允许下划线

# 正向预查:同时包含数字和字母
pwd_rule = r"(?=.*\d)(?=.*[a-zA-Z])[\w]{6,16}"
print(check_str_format("Abc123456", pwd_rule))  # True
print(check_str_format("12345678", pwd_rule))   # False 无字母
print(check_str_format("abcdefgh", pwd_rule))   # False 无数字

4. 纯中文校验

chinese_rule = r"[\u4e00-\u9fa5]+"
print(check_str_format("张三", chinese_rule))    # True
print(check_str_format("张三123", chinese_rule))# False

5. 身份证18位校验

前17位数字,最后一位可为数字/X/x

id_card_rule = r"\d{17}[\dXx]"
print(check_str_format("50010119990101123X", id_card_rule)) # True

6. 用户名校验(4-16位,仅字母数字下划线,不能纯数字)

username_rule = r"(?!^\d+$)\w{4,16}"
print(check_str_format("user_001", username_rule)) # True
print(check_str_format("123456", username_rule)) # False 纯数字

7. 日期校验 yyyy-MM-dd

简单通用版(不严格校验大小月,仅格式)

date_rule = r"\d{4}-\d{2}-\d{2}"
print(check_str_format("2026-07-13", date_rule)) # True
print(check_str_format("2026/07/13", date_rule)) # False

五、正则修饰符(flags)扩展校验

re.fullmatch 支持第三个参数flags,常用标识:

  1. re.IGNORECASE / re.I:忽略大小写匹配
  2. re.DOTALL / re.S.匹配换行符

示例:忽略大小写校验验证码(字母数字混合)

code_rule = r"[A-Z0-9]{6}"
# 不区分大小写
res = re.fullmatch(code_rule, "a1b2c3", flags=re.I)
print(res is not None) # True

改造工具函数,支持传flags:

def check_str_format(input_str: str, reg_pattern: str, flags=0) -> bool:
    if not isinstance(input_str, str):
        return False
    match_result = re.fullmatch(reg_pattern, input_str, flags=flags)
    return match_result is not None

print(check_str_format("ABC123", r"[a-z0-9]{6}", re.I))

六、常见踩坑问题总结

忘记使用原始字符串r"""\\d"r"\d" 效果一致,但复杂正则极易漏写转义,统一用r字符串。

误用match/search代替fullmatch:match只匹配开头,search匹配任意位置,不能校验完整字符串:

# 错误:search会判定"123abc"符合数字规则
print(re.search(r"\d+", "123abc"))  # 有匹配结果
# 正确:fullmatch要求整体全匹配
print(re.fullmatch(r"\d+", "123abc")) # None

缺少长度限制导致超长字符串通过校验:手机号只允许11位,必须写{11},不能只写\d+

中文正则编码范围错误:中文Unicode区间固定[\u4e00-\u9fa5],不要自定义字符集。

七、完整可运行综合示例

整合工具函数+多场景校验,直接复制运行:

import re

def check_str_format(input_str: str, reg_pattern: str, flags=0) -> bool:
    if not isinstance(input_str, str):
        return False
    match_result = re.fullmatch(reg_pattern, input_str, flags=flags)
    return match_result is not None

if __name__ == "__main__":
    # 定义各类校验规则
    rules = {
        "手机号": r"1[3-9]\d{9}",
        "邮箱": r"\w+@[a-zA-Z0-9]+\.[a-zA-Z]{2,}",
        "6位数字验证码": r"\d{6}",
        "密码(6-16位数字+字母)": r"(?=.*\d)(?=.*[a-zA-Z])[\w]{6,16}"
    }

    test_data = [
        ("13912345678", "手机号"),
        ("test@163.com", "邮箱"),
        ("abc123", "6位数字验证码"),
        ("Pass123456", "密码(6-16位数字+字母)")
    ]

    for content, rule_name in test_data:
        result = check_str_format(content, rules[rule_name])
        print(f"待校验:{content} | 规则:{rule_name} | 校验结果:{'通过' if result else '不通过'}")

八、总结

  1. Python字符串格式校验标准方案:re.fullmatch + 原始字符串正则;
  2. 业务开发建议封装通用校验函数,统一管理正则规则,便于维护;
  3. 复杂格式使用正向预查实现多条件同时限制(如密码同时含数字字母);
  4. 区分match/search/fullmatch,完整格式校验只用fullmatch避免逻辑漏洞;
  5. 正则支持flags修饰符,快速实现忽略大小写等扩展需求。

以上就是Python正则表达式校验字符串格式的完整指南的详细内容,更多关于Python校验字符串格式的资料请关注脚本之家其它相关文章!

相关文章

  • Python3中在Anaconda环境下安装basemap包

    Python3中在Anaconda环境下安装basemap包

    今天小编就为大家分享一篇关于Python3中在Anaconda环境下安装basemap包的文章,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2018-10-10
  • 如何利用饰器实现 Python 函数重载

    如何利用饰器实现 Python 函数重载

    这篇文章主要介绍了如何利用饰器实现 Python 函数重载,需要的朋友可以参考下面文章内容,希望能帮助到你
    2021-09-09
  • 一文带你深度解密Python的字节码

    一文带你深度解密Python的字节码

    当我们想要执行一个 py 文件的时候,只需要在命令行中输入 python xxx.py 即可,但你有没有想过这背后的流程是怎样的呢?本文主要贺和大家来聊聊Python中的字节码,感兴趣的可以了解一下
    2022-12-12
  • Python办公自动化之定时邮件提醒和音视频文件处理

    Python办公自动化之定时邮件提醒和音视频文件处理

    这篇文章主要为大家详细介绍了Python办公自动化中定时邮件提醒和音视频文件处理的相关知识,文中的示例代码讲解详细,需要的小伙伴可以了解下
    2023-12-12
  • 对python自动生成接口测试的示例讲解

    对python自动生成接口测试的示例讲解

    今天小编就为大家分享一篇对python自动生成接口测试的示例讲解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-11-11
  • Python+OpenCV实现定位二维码

    Python+OpenCV实现定位二维码

    这篇文章主要为大家详细介绍了如何利用Python和OpenCV实现定位二维码功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2023-12-12
  • Python脚本简单实现打开默认浏览器登录人人和打开QQ的方法

    Python脚本简单实现打开默认浏览器登录人人和打开QQ的方法

    这篇文章主要介绍了Python脚本简单实现打开默认浏览器登录人人和打开QQ的方法,涉及Python针对浏览器及应用程序的相关操作技巧,代码非常简单实用,需要的朋友可以参考下
    2016-04-04
  • Python高阶函数之filter()函数代码示例

    Python高阶函数之filter()函数代码示例

    这篇文章主要介绍了Python高阶函数之filter()函数代码示例,获取了一个序列的时候,想要把一些内容去掉,保留一部分内容的时候可以使用高效的filter()函数,需要的朋友可以参考下
    2023-07-07
  • 用python处理图片实现图像中的像素访问

    用python处理图片实现图像中的像素访问

    本篇文章主要介绍了用python处理图片实现图像中的像素访问,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-05-05
  • python绘制双柱形图代码实例

    python绘制双柱形图代码实例

    这篇文章主要介绍了python绘制双柱形图代码实例,具有一定借鉴价值,需要的朋友可以参考下。
    2017-12-12

最新评论