Python正则表达式校验字符串格式的完整指南
前言
日常开发中大量场景需要校验字符串格式:手机号、邮箱、身份证、密码、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("格式错误")
二、正则基础元字符(校验必学)
写校验规则必须掌握基础符号:
\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,避免转义冲突:
# 正确写法
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,常用标识:
re.IGNORECASE / re.I:忽略大小写匹配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 '不通过'}")
八、总结
- Python字符串格式校验标准方案:
re.fullmatch+ 原始字符串正则; - 业务开发建议封装通用校验函数,统一管理正则规则,便于维护;
- 复杂格式使用正向预查实现多条件同时限制(如密码同时含数字字母);
- 区分
match/search/fullmatch,完整格式校验只用fullmatch避免逻辑漏洞; - 正则支持flags修饰符,快速实现忽略大小写等扩展需求。
以上就是Python正则表达式校验字符串格式的完整指南的详细内容,更多关于Python校验字符串格式的资料请关注脚本之家其它相关文章!
相关文章
Python3中在Anaconda环境下安装basemap包
今天小编就为大家分享一篇关于Python3中在Anaconda环境下安装basemap包的文章,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧2018-10-10
Python脚本简单实现打开默认浏览器登录人人和打开QQ的方法
这篇文章主要介绍了Python脚本简单实现打开默认浏览器登录人人和打开QQ的方法,涉及Python针对浏览器及应用程序的相关操作技巧,代码非常简单实用,需要的朋友可以参考下2016-04-04


最新评论