正则表达式前戏
案例:京东注册手机号体验
基本需求:手机号必须是11位、手机号必须以13 15 17 18 19 开头、必须是纯数字
'''纯python代码实现'''
while True:
phone_num = input('请输入您的手机号>>>>:').strip()
if len(phone_num) == 11:
if phone_num.isdigit():
if phone_num.startswith('13') or phone_num.startswith('15') or phone_num.startswith(
'17') or phone_num.startswith('18') or phone_num.startswith('19'):
print('手机号输入正确')
else:
print('手机号开头不对')
else:
print('手机号必须是纯数字')
else:
print('手机号必须是11位')
'''python结合正则实现'''
import re
phone_number = input('please input your phone number:')
if re.match('^(13|14|15|18[0-9]{9}$',phone_number):
print('是合法的手机号码')
else:
print('不是合法的手机号码')
"""
正则表达式是一门独立的技术 所有编程语言都可以使用
它的作用可以简单的概括为:利用一些特殊符号(也可以直接写需要查找的具体字符)
的组合产生一些特殊的含义然后去字符串中筛选出符合条件的数据
>>>:筛选数据(匹配数据)
"""
字符组
'''字符组默认匹配方式是挨个挨个匹配'''
[0123456789] 匹配0-9任意一个数(全写)
[0-9] 匹配0-9任意一个数(缩写)
[a-z] 匹配26个小写英文字母任意一个
[A-Z] 匹配26个大写英文字母
[0-9a-zA-Z] 匹配数字或者小写字母或者大写字母
ps:字符组内所有的数据默认都是或的关系
特殊符号
'''特殊符号默认匹配方式是挨个挨个匹配'''
. 匹配除换行符以外的任意字符
\w 匹配数字、字母、下划线
\W 匹配非数字、非字母、非下划线
\d 匹配数字
^ 匹配字符串的开头
$ 匹配字符串的结尾
^$ 两者组合使用可以非常精确的限制匹配的内容
a|b 匹配a或者b(管道符的意思是或)
() 给正则表达式分组 不影响表达式的匹配功能
[] 字符组 内部填写的内容默认都是或的关系
[^] 取反操作 匹配除了字符组里面的其它所有字符
量词
'''正则表达式默认情况下都是贪婪匹配>>>:尽可能多的匹配'''
* 匹配零次或多次 默认是多次(无穷次)
+ 匹配一次或多次 默认是多次(无穷次)
? 匹配零次或一次 作为量词意义不大主要用于非贪婪匹配
{n} 重复n次
{n,} 重复n次或更多次 默认是多次(无穷次)
{n,m} 重复n到m次 默认是m次
ps:量词必须结合表达式一起使用 不能单独出现 并且只影响左边第一个表达式
jason\d{3} 只影响\d
贪婪匹配与非贪婪匹配
'''所有的量词都是贪婪匹配 如果想要变为非贪婪匹配 只需要在量词后面加问号'''
待匹配的文本
<script>alert(123)</script>
待使用的正则(贪婪匹配)
<.*>
请问匹配的内容
<script>alert(123)</script>
# .*属于典型的贪婪匹配 使用它 结束条件一般在左右明确指定
待使用的正则(非贪婪匹配)
<.*?>
匹配的内容 <script> </script>
转义符
"""斜杆与字母的组合有时候有特殊含义"""
\n 匹配的是换行符
\\n 匹配的是文本\n
\\\\n 匹配的是文本\\n
ps:如果在python中使用 还可以在字符串前面加r取消转义
正则表达式实战建议
1.编写校验用户身份证号的正则
^[1-9]\d{13-16}[0-9x]$
^[1-9]\d{14}(\d{2}[0-9x])?$
^([1-9]\d{16}[0-9x]|[1-9]\d{14})$
'''很多时候 很多问题 前人都已经弄好了 你只需要花点时间找一找就可以'''
re模块
import re
res = re.findall('a', 'jason apple eval')
print(res) # ['a', 'a', 'a']
# 查找所有符合正则表达式要求的数据 结构直接是一个列表
res = re.finditer('a','jason apple eval')
print(res) # <callable_iterator object at 0x000001D4B1C95C70>
# 查找所有符合正规表达式要求的数据 结果直接是一个迭代器对象
res = re.search('a', 'jason apple eval')
print(res) # <re.Match object; span=(1, 2), match='a'>
print(res.group()) # a 匹配到一个符合条件的数据就立刻结束
res = re.match('a','jason apple eval')
print(res) # None 匹配字符串的开头,如果不符合后面不用看了
obj = re.compile('\d{3}')
# 当某个正则表达式需要频繁使用的时候,我们可以做成模板
res1 = obj.findall('234234234234') # ['234', '234', '234', '234']
res2 = obj.findall('asdfasdf1234123') # ['123', '412']
print(res1,res2)
ret = re.split('[ab]', 'abcd') # 先按'a'分割得到''和'bcd',在对''和'bcd'分别按'b'分割
print(ret) # ['', '', 'cd']
ret = re.sub('\d', 'H', 'eva3jason4yuan4', 1) # 将数字替换成'H',参数1表示只替换1个
print(ret) # evaHjason4yuan4
ret = re.subn('\d', 'H', 'eva3jason4yuan4') # 将数字替换成'H',返回元组(替换的结果,替换了多少次)
print(ret) # ('evaHjasonHyuanH', 3)
re模块补充说明
import re
1.分组优先
res = re.findall('www.(baidu|oldboy).com','www.oldboy.com')
print(res)
res = re.findall('www.(?:baidu|oldboy).com','www.oldboy.com')
print(res)
res = re.search('www.(baidu|oldboy).com','www.oldboy.com')
print(res.group())
res = re.match('www.(baidu|oldboy).com','www.oldboy.com')
print(res.group())
2. 分组别名
res = re.search('www.(?P<content>baidu|oldboy)(?P<hei>.com)','www.oldboy.com')
print(res.group())
print(res.group('content'))
print(res.group(0))
print(res.group(1))
print(res.group(2))
print(res.group('hei'))
网络爬虫简介
网络爬虫:通过编写代码模拟浏览器发送请求获取数据并按照自己指定的要求筛选出想要的数据
作业
小练习:利用正则表达式筛选出红牛所有的分公司数据并打印或保存
公司名称:
公司地址:
公司邮编:
公司电话:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现