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

📅 2026/7/13 17:21:15
Python正则表达式校验字符串格式完整指南
前言日常开发中大量场景需要校验字符串格式手机号、邮箱、身份证、密码、URL、日期、用户名等。如果使用字符串切片、循环判断实现校验代码冗余且可读性差正则表达式re模块是Python处理格式校验最优方案。本文从零讲解Pythonre模块校验字符串的核心用法包含基础语法、常用校验函数、实战通用正则模板所有代码可直接复制运行。一、Python正则基础模块介绍Python内置re标准库无需额外安装导入即可使用importre核心校验方法对比格式检测专用方法作用适用场景re.match(pattern, str)从字符串开头匹配校验整体格式必须从头符合规则re.fullmatch(pattern, str)完整字符串完全匹配字符串格式校验首选推荐re.search(pattern, str)任意位置匹配子串查找是否包含指定内容不适合完整格式校验格式校验优先使用re.fullmatch只有整个字符串完全符合正则规则才返回匹配对象否则返回None逻辑最直观。匹配对象判断规则执行匹配后有返回值Match对象格式正确返回None格式错误importre resre.fullmatch(r\d,123456)ifres:print(格式合法)else:print(格式错误)二、正则基础元字符校验必学写校验规则必须掌握基础符号\d数字 0-9\D非数字\w字母/数字/下划线\W非单词字符\s空白空格、制表符\S非空白^字符串开头$字符串结尾fullmatch可省略{n}固定n位{n,m}n~m位[]字符集[0-9a-z]小写数字()分组|或.任意字符不含换行*0次及以上1次及以上?0或1次原始字符串 r 关键提醒正则中大量反斜杠\Python普通字符串会转义正则表达式必须加前缀r避免转义冲突# 正确写法patternr\d{11}# 错误写法需要双反斜杠极易出错pattern\\d{11}三、通用封装字符串格式校验工具函数封装通用校验方法项目中直接复用importredefcheck_str_format(input_str:str,reg_pattern:str)-bool: 正则校验字符串完整格式 :param input_str: 待检测字符串 :param reg_pattern: 正则表达式 :return: 合法返回True非法返回False ifnotisinstance(input_str,str):returnFalsematch_resultre.fullmatch(reg_pattern,input_str)returnmatch_resultisnotNone# 测试示例if__name____main__:# 校验6位纯数字num_ruler\d{6}print(check_str_format(123456,num_rule))# Trueprint(check_str_format(12345a,num_rule))# False四、高频业务场景正则校验实战1. 手机号校验国内11位规则1开头第二位3-9后接9位数字phone_ruler1[3-9]\d{9}print(check_str_format(13800138000,phone_rule))# Trueprint(check_str_format(12800138000,phone_rule))# False2. 邮箱格式校验通用邮箱规则字母数字下划线域名.后缀email_ruler\w[a-zA-Z0-9]\.[a-zA-Z]{2,}print(check_str_format(test123qq.com,email_rule))# Trueprint(check_str_format(test.com,email_rule))# False3. 密码强度校验需求6-16位必须包含数字字母允许下划线# 正向预查同时包含数字和字母pwd_ruler(?.*\d)(?.*[a-zA-Z])[\w]{6,16}print(check_str_format(Abc123456,pwd_rule))# Trueprint(check_str_format(12345678,pwd_rule))# False 无字母print(check_str_format(abcdefgh,pwd_rule))# False 无数字4. 纯中文校验chinese_ruler[\u4e00-\u9fa5]print(check_str_format(张三,chinese_rule))# Trueprint(check_str_format(张三123,chinese_rule))# False5. 身份证18位校验前17位数字最后一位可为数字/X/xid_card_ruler\d{17}[\dXx]print(check_str_format(50010119990101123X,id_card_rule))# True6. 用户名校验4-16位仅字母数字下划线不能纯数字username_ruler(?!^\d$)\w{4,16}print(check_str_format(user_001,username_rule))# Trueprint(check_str_format(123456,username_rule))# False 纯数字7. 日期校验 yyyy-MM-dd简单通用版不严格校验大小月仅格式date_ruler\d{4}-\d{2}-\d{2}print(check_str_format(2026-07-13,date_rule))# Trueprint(check_str_format(2026/07/13,date_rule))# False五、正则修饰符flags扩展校验re.fullmatch支持第三个参数flags常用标识re.IGNORECASE / re.I忽略大小写匹配re.DOTALL / re.S.匹配换行符示例忽略大小写校验验证码字母数字混合code_ruler[A-Z0-9]{6}# 不区分大小写resre.fullmatch(code_rule,a1b2c3,flagsre.I)print(resisnotNone)# True改造工具函数支持传flagsdefcheck_str_format(input_str:str,reg_pattern:str,flags0)-bool:ifnotisinstance(input_str,str):returnFalsematch_resultre.fullmatch(reg_pattern,input_str,flagsflags)returnmatch_resultisnotNoneprint(check_str_format(ABC123,r[a-z0-9]{6},re.I))六、常见踩坑问题总结忘记使用原始字符串r\\d和r\d效果一致但复杂正则极易漏写转义统一用r字符串。误用match/search代替fullmatchmatch只匹配开头search匹配任意位置不能校验完整字符串# 错误search会判定123abc符合数字规则print(re.search(r\d,123abc))# 有匹配结果# 正确fullmatch要求整体全匹配print(re.fullmatch(r\d,123abc))# None缺少长度限制导致超长字符串通过校验手机号只允许11位必须写{11}不能只写\d。中文正则编码范围错误中文Unicode区间固定[\u4e00-\u9fa5]不要自定义字符集。七、完整可运行综合示例整合工具函数多场景校验直接复制运行importredefcheck_str_format(input_str:str,reg_pattern:str,flags0)-bool:ifnotisinstance(input_str,str):returnFalsematch_resultre.fullmatch(reg_pattern,input_str,flagsflags)returnmatch_resultisnotNoneif__name____main__:# 定义各类校验规则rules{手机号:r1[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,手机号),(test163.com,邮箱),(abc123,6位数字验证码),(Pass123456,密码(6-16位数字字母))]forcontent,rule_nameintest_data:resultcheck_str_format(content,rules[rule_name])print(f待校验{content}| 规则{rule_name}| 校验结果{通过ifresultelse不通过})八、总结Python字符串格式校验标准方案re.fullmatch 原始字符串正则业务开发建议封装通用校验函数统一管理正则规则便于维护复杂格式使用正向预查实现多条件同时限制如密码同时含数字字母区分match/search/fullmatch完整格式校验只用fullmatch避免逻辑漏洞正则支持flags修饰符快速实现忽略大小写等扩展需求。后续拓展可结合Django/Flask表单校验、接口入参校验将本文工具函数封装为全局校验工具统一项目字符串格式校验逻辑。