廖雪峰python学习笔记15.正则表达式入门

本文详细介绍正则表达式的常用语法及其应用场景,包括基础匹配、进阶匹配技巧、贪婪匹配及如何利用正则表达式进行字符串切分。通过具体实例演示如何编写正则表达式来验证电子邮件地址。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

# -*- coding:utf-8 -*-

#正则表达式是一种用来匹配字符串的强有力的武器
#用\d可以匹配一个数字,\w可以匹配一个字母或数字

"""
'00\d'可以匹配'007',但无法匹配'00A';

'\d\d\d'可以匹配'010';

'\w\w\d'可以匹配'py3';

\s可以匹配一个空格(也包括Tab等空白符),所以\s+表示至少有一个空格

.可以匹配任意字符

要匹配'010-12345' 由于'-'是特殊字符,在正则表达式中,要用'\'转义,所以,上面的正则是\d{3}\-\d{3,8}

进阶

要做更精确地匹配,可以用[]表示范围,比如:

[0-9a-zA-Z\_]可以匹配一个数字、字母或者下划线;

[0-9a-zA-Z\_]+可以匹配至少由一个数字、字母或者下划线组成的字符串,比如'a100','0_Z','Py3000'等等;

[a-zA-Z\_][0-9a-zA-Z\_]*可以匹配由字母或下划线开头,后接任意个由一个数字、字母或者下划线组成的字符串,也就是Python合法的变量;

[a-zA-Z\_][0-9a-zA-Z\_]{0, 19}更精确地限制了变量的长度是1-20个字符(前面1个字符+后面最多19个字符)

A|B可以匹配A或B,所以[P|p]ython可以匹配'Python'或者'python'。

^表示行的开头,^\d表示必须以数字开头。

$表示行的结束,\d$表示必须以数字结束。


切分字符串
用正则表达式切分字符串比用固定的字符更灵活,请看正常的切分代码:
'a b   c'.split(' ')
['a', 'b', '', '', 'c']
没法切分出字符,可以这样
re.split(r'\s+', 'a b   c')
['a', 'b', 'c']

"""

#了解了上述知识后,就可以使用正则表达式了

#练习:

import re


#匹配并分离出区号和电话号码
m = re.match(r'^(\d{3})-(\d{3,8})$','010-3375597')  #这里的字符串正则表达式用()分组
print(m)
#提取出区号和电话号码
print(' %s,  %s ,  %s' %  (m.group(0),m.group(1),m.group(2)))

"""
贪婪匹配

最后需要特别指出的是,正则匹配默认是贪婪匹配,也就是匹配尽可能多的字符。举例如下,匹配出数字后面的0:

>>> re.match(r'^(\d+)(0*)$', '102300').groups()
('102300', '')
由于\d+采用贪婪匹配,直接把后面的0全部匹配了,结果0*只能匹配空字符串了。

必须让\d+采用非贪婪匹配(也就是尽可能少匹配),才能把后面的0匹配出来,加个?就可以让\d+采用非贪婪匹配:

>>> re.match(r'^(\d+?)(0*)$', '102300').groups()
('1023', '00')
"""
#练习

#请尝试写一个验证Email地址的正则表达式。版本一应该可以验证出类似的Email:

n = re.match(r'^(\w+)@(\w+).(\w+)$','thinker_leo@hotmail.com')
print(n.group(1))
print(n.group(2))
print(n.group(3))

本文档格式为word文档,包含了相应的目录结构。 Python教程 1 关于作者 2 Python简介 2 1 安装Python 5 1.1 Python解释器 8 2 第一个Python程序 9 2.1 使用文本编辑器 10 2.2 输入和输出 14 3 Python基础 17 3.1 数据类型和变量 18 3.2 字符串和编码 25 3.3 使用list和tuple 34 3.4 条件判断 39 3.5 循环 43 3.6 使用dict和set 45 4 函数 50 4.1 调用函数 52 4.2 定义函数 54 4.3 函数的参数 58 4.4 递归函数 70 5 高级特性 73 5.1 切片 73 5.2 迭代 77 5.3 列表生成式 79 5.4 生成器 81 5.5 迭代器 88 6 函数式编程 90 6.1 高阶函数 91 6.1.1 map/reduce 94 6.1.2 filter 97 6.1.3 sorted 100 6.2 返回函数 101 6.3 匿名函数 105 6.4 装饰器 106 6.5 偏函数 110 7 模块 112 7.1 使用模块 114 7.2 安装第三方模块 118 8 面向对象编程 120 8.1 类和实例 122 8.2 访问限制 126 8.3 继承和多态 128 8.4 获取对象信息 134 8.5 实例属性和类属性 141 9 面向对象高级编程 143 9.1 使用__slots__ 143 9.2 使用@property 146 9.3 多重继承 149 9.4 定制类 154 9.5 使用枚举类 164 9.6 使用元类 167 10 错误、调试和测试 175 10.1 错误处理 176 10.2 调试 186 10.3 单元测试 191 10.4 文档测试 196 11 IO编程 200 11.1 文件读写 201 11.2 StringIO和BytesIO 205 11.3 操作文件和目录 207 11.4 序列化 210 12 进程和线程 215 12.1 多进程 217 12.2 多线程 225 12.3 ThreadLocal 232 12.4 进程 vs. 线程 235 12.5 分布式进程 237 13 正则表达式 243 13.1 常用内建模块 249 13.1.1 datetime 249 13.1.2 collections 254 13.1.3 base64 258 13.1.4 struct 260 13.1.5 hashlib 262 13.1.6 itertools 267 13.1.7 XML 270 13.1.8 HTMLParser 272 13.1.9 urllib 274 14 常用第三方模块 278 14.1 PIL 278 15 virtualenv 282 16 图形界面 284 17 网络编程 288 17.1 CP/IP简介 289 17.2 TCP编程 291 17.3 UDP编程 296 18 电子邮件 298 18.1 SMTP发送邮件 300 18.2 POP3收取邮件 308 19 访问数据库 314 19.1 使用SQLite 318 19.2 用MySQL 321 19.3 使用SQLAlchemy 324 20 Web开发 329 20.1 HTTP协议简介 330 20.2 HTML简介 337 20.3 WSGI接口 341 20.4 使用Web框架 347 20.5 使用模板 352 21 异步IO 357 21.1 协程 359 21.2 syncio 362 21.3 async/await 366 21.4 aiohttp 367 22 实战 369 22.1 Day 1 - 搭建开发环境 372 22.2 Day 2 - 编写Web App骨架 374 22.3 Day 3 - 编写ORM 375 22.4 Day 4 - 编写Model 385 22.5 Day 5 - 编写Web框架 390 22.6 Day 6 - 编写配置文件 396 22.7 Day 7 - 编写MVC 398 22.8 Day 8 - 构建前端 399 22.9 Day 9 - 编写API 410 22.10 Day 10 - 用户注册和登录 412 22.11 Day 11 - 编写日志创建页 423 22.12 Day 12 - 编写日志列表页 432 22.13 Day 13 - 提升开发效率 439 22.14 Day 14 - 完成Web App 443 22.15 Day 15 - 部署Web App 445 22.16 Day 16 - 编写移动App 454 23 FAQ 456 24 期末总结 458
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值