文章目录
- 一个邮箱地址通常由 用户名@域名.顶级域名 构成。 用户名:可以包含字母、数字、下划线 _、点 . 和减号 -。 域名:与用户名类似。 顶级域名:通常是2个或更多字母,如 .com, .org, .io。 根据这个规则,我们可以构建如下的正则表达式: import re def validate_email(email): # ^ – 字符串开头 # [a-zA-Z0-9._%+-]+ – 用户名部分:至少一个字母、数字或特殊符号 # @ – @ 符号 # [a-zA-Z0-9.-]+ – 域名部分:至少一个字母、数字或点/减号 # . – 一个真正的点 . # [a-zA-Z]{2,} – 顶级域名:至少两个字母 # $ – 字符串结尾 pattern = r”^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+.[a-zA-Z]{2,}$” if re.fullmatch(pattern, email): return True return False # — 测试 — print(f”‘test.email@example.com’ 是有效的吗? {validate_email(‘test.email@example.com’)}”) print(f”‘invalid-email@.com’ 是有效的吗? {validate_email(‘invalid-email@.com’)}”) print(f”‘just-a-string’ 是有效的吗? {validate_email(‘just-a-string’)}”) 输出: 'test.email@example.com' 是有效的吗? True'invalid-email@.com' 是有效的吗? False'just-a-string' 是有效的吗? False 看,一个复杂的邮箱校验就这样轻松搞定了!
- 目前,中国大陆的手机号通常是11位数字,并且以特定的号段开头(如13x, 15x, 18x, 19x等)。为了简化,我们只校验“以1开头,后面跟10位数字”这个基本规则。 import re def validate_phone_number(phone): # ^1 – 必须以 1 开头 # d{10} – 后面必须是 10 个数字 # $ – 到字符串结尾 pattern = r”^1d{10}$” if re.fullmatch(pattern, phone): return True return False # — 测试 — print(f”‘13812345678’ 是有效的吗? {validate_phone_number(‘13812345678’)}”) print(f”‘12345678901’ 是有效的吗? {validate_phone_number(‘12345678901’)}”) # 不以1开头 print(f”‘1381234abcd’ 是有效的吗? {validate_phone_number(‘1381234abcd’)}”) # 包含非数字 输出: '13812345678' 是有效的吗? True'12345678901' 是有效的吗? False'1381234abcd' 是有效的吗? False 这个校验器可以快速过滤掉明显格式错误的手机号。
- 假设我们要求用户名必须: 以字母开头。 只能包含字母、数字和下划线。 长度在6到12个字符之间。 我们可以将这些规则组合起来: import re def validate_username(username): # ^ – 字符串开头 # [a-zA-Z] – 必须以一个字母开头 # [a-zA-Z0-9_]{5,11} – 后面跟着5到11个字母、数字或下划线 # $ – 字符串结尾 # 总长度就是 1 + (5到11) = 6到12 pattern = r”^[a-zA-Z][a-zA-Z0-9_]{5,11}$” if re.fullmatch(pattern, username): return True return False # — 测试 — print(f”‘user_123’ 是有效的吗? {validate_username(‘user_123’)}”) print(f”‘123user’ 是有效的吗? {validate_username(‘123user’)}”) # 不以字母开头 print(f”‘u’ 是有效的吗? {validate_username(‘u’)}”) # 太短 print(f”‘this_is_a_very_long_name’ 是有效的吗? {validate_username(‘this_is_a_very_long_name’)}”) # 太长 输出: 'user_123' 是有效的吗? True'123user' 是有效的吗? False'u' 是有效的吗? False'this_is_a_very_long_name' 是有效的吗? False 通过组合不同的元字符,我们可以轻松实现各种复杂的组合校验规则。
目录
- 为什么选择正则表达式做校验
- 数据校验的核心:re.match()与re.fullmatch()
- 实战演练:常见数据校验案例
- 案例一:校验电子邮箱(Email)
- 案例二:校验中国大陆手机号
- 案例三:校验用户名(中等复杂度)
- 总结与最佳实践
在我们的日常编程工作中,尤其是在处理用户输入或外部数据时,一个至关重要的环节就是数据校验。
想象一下这些场景:
- 用户注册时,你需要确保他输入的是一个格式正确的邮箱地址。
- 用户填写个人信息时,你需要验证他的手机号是否有效。
- 你从网上爬取数据,需要从一堆杂乱的文本中筛选出身份证号码。
如果靠手动写一堆 if/else 和字符串判断,代码会变得冗长、复杂且容易出错。今天,我们就来看看如何用Python的“神器”——正则表达式,来优雅、高效地解决这些数据校验问题。
简单来说,正则表达式就是一个描述文本模式的模板。对于数据校验,它有三大优势:
- 精确:可以定义非常复杂和精确的规则,比如“以字母开头,包含6到12位字母、数字和下划线”。
- 高效:底层由C语言实现,匹配速度远超我们自己写的Python循环和判断。
- 通用:一旦学会,不仅在Python中,你在JavaScript、Java、Shell脚本等几乎所有环境中都能使用它。
在数据校验中,我们通常关心的是整个字符串是否符合某个模式,而不是仅仅在字符串中找到一个匹配项。因此,re.match() 和 re.fullmatch() 是我们的首选。
re.match(pattern, string): 从字符串的开头开始匹配。如果模式只匹配了字符串的一部分,它也会成功,这有时会导致隐藏的bug。re.fullmatch(pattern, string): (推荐) 尝试将整个字符串与模式进行匹配。只有完全匹配时才会成功,这正是我们做数据校验时最需要的功能!
它们都会返回一个“匹配对象”(表示成功)或 None(表示失败)。我们通常这样使用:
import re
if re.fullmatch(pattern, data_to_check):
print("校验通过!")
else:
print("校验失败!")
让我们直接上手,解决几个最常见的数据校验需求。
一个邮箱地址通常由 用户名@域名.顶级域名 构成。
- 用户名:可以包含字母、数字、下划线
_、点.和减号-。 - 域名:与用户名类似。
- 顶级域名:通常是2个或更多字母,如
.com,.org,.io。
根据这个规则,我们可以构建如下的正则表达式:
import re
def validate_email(email):
# ^ - 字符串开头
# [a-zA-Z0-9._%+-]+ - 用户名部分:至少一个字母、数字或特殊符号
# @ - @ 符号
# [a-zA-Z0-9.-]+ - 域名部分:至少一个字母、数字或点/减号
# . - 一个真正的点 .
# [a-zA-Z]{2,} - 顶级域名:至少两个字母
# $ - 字符串结尾
pattern = r"^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+.[a-zA-Z]{2,}$"
if re.fullmatch(pattern, email):
return True
return False
# --- 测试 ---
print(f"'test.email@example.com' 是有效的吗? {validate_email('test.email@example.com')}")
print(f"'invalid-email@.com' 是有效的吗? {validate_email('invalid-email@.com')}")
print(f"'just-a-string' 是有效的吗? {validate_email('just-a-string')}")
输出:
'test.email@example.com' 是有效的吗? True
'invalid-email@.com' 是有效的吗? False
'just-a-string' 是有效的吗? False
看,一个复杂的邮箱校验就这样轻松搞定了!
目前,中国大陆的手机号通常是11位数字,并且以特定的号段开头(如13x, 15x, 18x, 19x等)。为了简化,我们只校验“以1开头,后面跟10位数字”这个基本规则。
import re
def validate_phone_number(phone):
# ^1 - 必须以 1 开头
# d{10} - 后面必须是 10 个数字
# $ - 到字符串结尾
pattern = r"^1d{10}$"
if re.fullmatch(pattern, phone):
return True
return False
# --- 测试 ---
print(f"'13812345678' 是有效的吗? {validate_phone_number('13812345678')}")
print(f"'12345678901' 是有效的吗? {validate_phone_number('12345678901')}") # 不以1开头
print(f"'1381234abcd' 是有效的吗? {validate_phone_number('1381234abcd')}") # 包含非数字
输出:
'13812345678' 是有效的吗? True
'12345678901' 是有效的吗? False
'1381234abcd' 是有效的吗? False
这个校验器可以快速过滤掉明显格式错误的手机号。
假设我们要求用户名必须:
- 以字母开头。
- 只能包含字母、数字和下划线。
- 长度在6到12个字符之间。
我们可以将这些规则组合起来:
import re
def validate_username(username):
# ^ - 字符串开头
# [a-zA-Z] - 必须以一个字母开头
# [a-zA-Z0-9_]{5,11} - 后面跟着5到11个字母、数字或下划线
# $ - 字符串结尾
# 总长度就是 1 + (5到11) = 6到12
pattern = r"^[a-zA-Z][a-zA-Z0-9_]{5,11}$"
if re.fullmatch(pattern, username):
return True
return False
# --- 测试 ---
print(f"'user_123' 是有效的吗? {validate_username('user_123')}")
print(f"'123user' 是有效的吗? {validate_username('123user')}") # 不以字母开头
print(f"'u' 是有效的吗? {validate_username('u')}") # 太短
print(f"'this_is_a_very_long_name' 是有效的吗? {validate_username('this_is_a_very_long_name')}") # 太长
输出:
'user_123' 是有效的吗? True
'123user' 是有效的吗? False
'u' 是有效的吗? False
'this_is_a_very_long_name' 是有效的吗? False
通过组合不同的元字符,我们可以轻松实现各种复杂的组合校验规则。
- 校验首选
re.fullmatch():因为它要求整个字符串都匹配模式,最符合“校验”的定义。
- 使用原始字符串
r"":在定义正则表达式模式时,总是在字符串前加上 r。这可以防止反斜杠 被Python解释为转义字符,避免很多不必要的麻烦。
- 从简单开始:先构建一个能满足基本需求的简单模式,然后逐步增加复杂性。
re.fullmatch():因为它要求整个字符串都匹配模式,最符合“校验”的定义。r"":在定义正则表达式模式时,总是在字符串前加上 r。这可以防止反斜杠 被Python解释为转义字符,避免很多不必要的麻烦。正则表达式是处理文本和数据的超级工具。虽然初学时可能会觉得有些晦涩,但一旦你掌握了它,就会发现它在数据清洗、验证和提取方面无与伦比的威力。把它加入你的技能库,你的代码一定会变得更强大、更健壮!
到此这篇关于Python利用正则表达式进行数据校验详解的文章就介绍到这了,更多相关Python正则表达式数据校验内容请搜索风君子博客以前的文章或继续浏览下面的相关文章希望大家以后多多支持风君子博客!
您可能感兴趣的文章:
- Python正则表达式在数据处理中的应用实战案例
- 详解如何使用Python和正则表达式处理XML表单数据
- python中如何使用正则表达式提取数据
- 使用Python正则表达式操作文本数据的方法
- python 自动化数据提取之正则表达式