正则,re模块
一.正则表达式
1.正则表达式前戏
引用:京东注册手机号校验
基本要求:手机号必须是11位、手机号必须以13 15 17 18 19开头、必须是纯数字
'''纯python代码实现'''
while Ture:
# 1.获取用户手机号码
phone_num = input('请输入您的手机号码>>>:').strip()
# 2.先判断是否是十一位
if len(phone_num) == 11:
# 3.再判断是否是纯数字
if phone_num.isdigit():
# 4.判断手机号的开头
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 nunmber:')
if re.math('^(13|14|15|18|19)[0-9]{9}$', phone_num):
print('是合法的手机号码')
else:
print('不是合法的手机号码')
"""
正则表达式是一门独立的技术 所有编程语言都可以使用
它的作用可以简单的概括为:利用一些特殊符号(也可以直接写需要查找的具体字符)的组合产生一些特殊的含义,然后去字符串中筛选出符合条件的数据
>>>:筛选数据(匹配数据)
"""
2.字符组
'''字符组默认匹配方式是挨个匹配'''
ps:字符组内所有的数据默认都是或的关系
[0123456789] | 匹配0到9任意一个数(全写) |
---|---|
[0-9] | 匹配0到9任意一个数(缩写) |
[a-z] | 匹配26个小写英文字母 |
[A-Z] | 匹配26个大写英文字母 |
[0-9a-zA-Z] | 匹配数字或者小写字母或者大写字母 |
3.特殊符号
'''特殊符号默认匹配方式是挨个挨个匹配'''
符号 | 功能 |
---|---|
. | 匹配除换行符以外的任意字符 |
\w | 匹配数字、字母、下划线 |
\W | 匹配非数字、非字母、非下划线 |
\d | 匹配数字 |
^ | 匹配字符串的开头 |
$ | 匹配字符串的结尾,与^结合使用可以非常精确的限制匹配的内容 |
a|b | 匹配a或者b(管道符的意思是或) |
() | 给正则表达式分组 不影响表达式匹配功能 |
[] | 字符 内部填写的内容默认都是或的关系 |
[^] | 取反操作 匹配除了字符组里面的其他所有字符,注意上尖号在中括号内和中括号外的意思完全不同 |
4.量词
'''正则表达式默认情况下都是贪婪匹配>>>:尽可能多的匹'''
量词 | 功能 | 备注 |
---|---|---|
* | 匹配零次或多次 | 默认是多次(无穷次) |
+ | 匹配一次到多次 | 默认是多次(无穷次) |
? | 匹配零次或一次 | 作为量词意义不大主要是用于非贪婪匹配 |
重复n次 | ||
重复n次或更多次 | 默认是多次(无穷次) | |
重复n到m次 | 默认是m次 |
ps:量词必须结合表达式一起使用 不能单独出现只影响左边第一个表达式
jason\d{3} 只影响\d
二.贪婪匹配和非贪婪匹配
"""
所有的量词都是贪婪匹匹配如果想要变为非贪婪匹配只需要在量词后面加问号
"""
待匹配文本
<script>alert(123)</script>
待使用的正则(贪婪匹配)
<.*>
请问匹配的内容
<script>alert(123)</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})$
2.编写校验邮箱的正则
3.编写校验用户手机号的正则(座机、移动)
4.编写校验用户qq号的正则
'''很多时候 很多问题 前人已经弄好了 你只需要花点时间找一找就可以'''
ps:能够写出简单的正则 能够大致看懂复杂的正则
五.re模块
在python中如果相使用正则 可以考虑re模块
1.常见操作方法
import re
res = re.finadall('a', 'jason apple eva')
print(res) # 查找所有符合正则表达式要求的数据 结果直接是一个列表
res = re.finditer('a', 'jason apple eva')
print(res) # 查找所有符合正则表达式要求的数据 结果直接是一个迭代器对象
res = re.search('a', 'jsaon apple eva')
print(res) # <re.Match object; span=(1, 2), match='a'>
print(res.group()) # a 匹配到一个符合条件的数据就立刻结束
res = re.match('a', 'jason apple eva')
print(res) # None 匹配字符串的开头 如果不符合后面不用看了
print(res.group()) # 匹配开头符合条件的数据 一个就结束
obj = re.compile('\d{3}') # 当某一个正则表达式需要频繁使用的时候 我们可以做成模板
res1 = obj.findall('23423422342342344')
res2 = obj.findall('asjdkasjdk32423')
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)
2.re模块补充说明
1.分组优先
res = re.findall('www.(baidu|oldboy).com', 'www.oldboy.com')
print(res) # ['oldboy']
# findall分组优先展示:优先展示括号内正则表达式匹配到的内容
res = re.findall('www.(?:baidu|oldboy).com', 'www.oldboy.com')
print(res) # ['www.oldboy.com']
res = re.search('www.(baidu|oldboy).com', 'www.oldboy.com')
print(res.group()) # www.oldboy.com
res = re.match('www.(baidu|oldboy).com', 'www.oldboy.com')
print(res.group()) # www.oldboy.com
2.分组起名
res = re.search('www.(?P<content>baidu|oldboy)(?P<hei>.com)', 'www.oldboy.com')
print(res.group()) # www.oldboy.com
print(res.group('content')) # oldboy
print(res.group(0)) # www.oldboy.com
print(res.group(1)) # oldboy
print(res.group(2)) # .com
print(res.group('hei')) # .com
六.网络爬虫简介
1.什么是互联网?
将全世界的计算机连接到一起组成的网络
2.互联网发明的目的是什么?
让连接到互联网的计算机数据彼此共享
3.上网的本质是什么?
基于互联网访问其他人计算机上共享数据(服务器存在的意义就是让其他人来访问)
4.网络爬虫的本质是什么?
通过编写代码模拟计算机浏览器朝目标网址发送请求获取数据并筛选出想要的数据