关注我,学习更多实用Python知识
🌈Hi,小伙伴们~
🛠️当需要匹配、搜索、替换文本内容时,正则表达式可能是你当之无愧的首选!它通过特定规则组成的模式(Pattern),能精准匹配文本中的目标字符,无论是在格式验证、文本处理、网络爬虫还是日志分析,正则表达式都扮演着重要角色
🎯今天,梳理和总结一下它的用法,帮你跨过它那看似复杂的语法门槛~✨

本质:是用特殊符号描述的字符串匹配规则。想象成一个"文本筛子":你定义好筛孔的形状和大小,文本经过时,符合规则的部分就被"筛"出来
🎯核心思想 :用简短的代码描述复杂的文本模式,而不是写冗长的判断逻辑
\d → 数字(0-9) 0️⃣1️⃣2️⃣\w → 单词字符(字母/数字/下划线)\s → 空白字符(空格、制表符等) ␣. → 任意单个字符(除了换行符) 🎲^ → 字符串开头$ → 字符串结尾* → 0次或多次 ⭕⭕⭕+ → 1次或多次 1️⃣/1️⃣2️⃣3️⃣? → 0次或1次 0️⃣/1️⃣{n} → 正好n次 3️⃣3️⃣3️⃣{n,m} → n到m次 2️⃣3️⃣[abc] → 匹配a、b、c中任意一个 🅰️/🅱️/🅲️[a-z] → 匹配a到z任意一个字母 🔤| → 或(匹配左边或右边) ↔️() → 分组(提取这部分内容) 📦\. → 匹配实际的点号(不是任意字符) ⚫\\ → 匹配反斜杠 \(不是转义符) ⬅️\* → 匹配*号(不是重复符) ✳️\+ → 匹配+号(不是多次符) ➕\? → 匹配?号(不是可选符) ❓\t → 匹配制表符 ⇥\n → 匹配换行符 ↵\r → 匹配回车符 ↩\D → 匹配非数字字符 🔢\W → 匹配非单词字符 🔤\S → 匹配非空白字符 ␣\b → 匹配单词边界位置 🚧\B → 匹配非单词边界位置 🚧# 邮箱验证defis_valid_email_advanced(email): pattern = r'^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$'return bool(re.match(pattern, email))# 解析: ^[a-zA-Z0-9._%+-]+ 用户名:允许更多特殊字符 @ 必须有@ [a-zA-Z0-9.-]+ 域名部分:允许点号和中划线 \.[a-zA-Z]{2,}$ 顶级域名:至少2个字母# 手机号验证def is_valid_phone(phone):return bool(re.match(r'^1[3-9]\d{9}$', phone))# 解析:^ - 字符串开头锚点,必须从开头匹配1 - 必须以数字1开头(中国手机号标准)[3-9] - 第二位必须是3-9中的任意一个数字\d{9} - 后面必须有正好9个数字$ - 字符串结尾锚点,必须匹配到结尾# 从混合文本中提取关键信息text = "张三,电话138-1234-5678,邮箱zhangsan@qq.com"# 提取姓名、电话、邮箱name = re.search(r'^(.+?),', text).group(1)phone = re.search(r'电话(\S+)', text).group(1)email = re.search(r'邮箱(\S+)', text).group(1)# 清理不规范数据dirty_text = "价格:$100.00 特价!!优惠¥80.5元"# 提取所有价格数字prices = re.findall(r'[¥$](\d+\.?\d*)', dirty_text)print(prices) # ['100.00', '80.5']# 清理特殊字符cleaned = re.sub(r'[!!]', '', dirty_text)print(cleaned) # 价格:$100.00 特价优惠¥80.5元\w+@\w+\.\w+1[3-9]\d{9}https?://\S+\d+\.\d+\.\d+\.\d+[\u4e00-\u9fa5]+原始文本:"我的电话是138-1234-5678"正则模式:r"(\d{3})-(\d{4})-(\d{4})"匹配过程:1. 🔍 正则引擎扫描文本2. ✅ 找到"138-1234-5678"符合模式3. 📦 括号分组捕获: group(0): "138-1234-5678"# 整个匹配 group(1): "138"# 第一个括号 group(2): "1234"# 第二个括号 group(3): "5678"# 第三个括号text = "<div>标题</div><div>内容</div>"# 贪婪匹配(默认):尽可能多地匹配greedy = re.search(r'<div>.*</div>', text)print(greedy.group()) # <div>标题</div><div>内容</div># 非贪婪匹配(加?):尽可能少地匹配lazy = re.search(r'<div>.*?</div>', text)print(lazy.group()) # <div>标题</div>✅ 总结:要尽可能多地匹配就贪婪,少匹配就非贪婪
# 如果需要多次使用同一个正则,先编译pattern = re.compile(r'\d+')# 然后重复使用result1 = pattern.findall(text1)result2 = pattern.findall(text2) # 更快!记住思维方式:先想清楚你要匹配的什么特征,然后用符号去描述这个特征,比如匹配电话号码 → "1开头,后面10个数字" → 1\d{10}
大多数情况下,掌握上面列出的基本符号就足够解决80%的实际问题了
💡 关注我,每周分享 Python 干货 × 操作技巧
📌 如果这篇文章对你有帮助,欢迎:
👍 点赞 | ⭐ 收藏 | 🔄 分享给朋友


👇点击阅读往期文章