正则表达与re模块

正则表达式

正则表达式是一门独立的技术,所有编程语言都可以使用

1.正则表达式含义:

正则表达式就是用一些特殊符号的组合产生特殊含义去字符串中筛选符合条件的数据。
也可以直接写需要查找的具体字符
主要就是用来筛选、匹配数据

正则表达式线上测试网址:http://tool.chinaz.com/regex/

2)正则表达式前戏:注册手机号校验

案例:京东注册手机号校验,需求:手机号必须11位、手机号必须13、14、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('14') 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位')
    
————————————————————————————————————————————
"""使用正则表达式实现"""
import re
while True:
    phone_num=input('输入您的手机号:').strip()
    if re.match('^(13|14|15|17|18|19)[0-9]{9}$',phone_num):
        print('手机号合法')
    else:
        print('手机号不合法')
正则表达式—字符组

1.字符组默认匹配方式是:一个一个的匹配
2.字符组内所有的数据默认都是或的关系

字符组简写 字符组全称 含义
[0-9] [0123456789] 匹配0~9的任意一个数字
[A-Z] [ABC...XYZ] 匹配A~Z的任意一个字母
[a-z] [abc...xyz] 匹配a~z的任意一个字母
[0-9a-zA-Z] 匹配0~9任意数字、大小写任意字母
正则表达式—特殊符号

1.字符组默认匹配方式是:一个一个的匹配

特殊符号 含义
. 匹配处换行符外的任意字符
\w 匹配数字、字母、下划线
\W 匹配非数字、非字母、非下划线
\d 匹配数字
^ 匹配字符串的开头
$ 匹配字符串的结尾
^数据$ 两者组合使用可以精确限制匹配的内容
a|b 匹配a或b
() 给正则表达式分组,不影响表达式的匹配
[ ] 字符组内部填写的内容默认都是或的关系
[^] 取反操作 匹配除了字符组内填写的其他字符
正则表达式—量词

1.正则表达式默认情况下都是贪婪匹配(尽可能多的匹配)
2.量词不能单独使用,必须结合表达式一起,且只能影响左边第一个表达式

量词 含义
***** 匹配0次或多次 默认是多次
+ 匹配1次或多次 默认是多次
匹配0次或1次 默认是1次
{n} 重复n次 写几次就是几次
{n,} 重复n次或更多次 默认是多次
{n,m} 重复n到m次 默认是m次
贪婪匹配与非贪婪匹配

1.所有的量词都是贪婪匹配, 非贪婪匹配需要在量词后加问号
2.贪婪匹配与非贪婪匹配结束是由左右两边添加的表达式决定的

待匹配的文本:
    <script>alert(123)</script>
正则:
    <.*> # 贪婪匹配
结果:
    <script>alert(123)</script>
————————————————————————————————————————
待匹配的文本:
    <script>alert(123)</script> 
正则:
    <.*?> # 非贪婪匹配
结果:
    <script>
    </script>
转义符
"""斜杠与字母的组合有时候有特殊含义"""
\n          匹配的是换行符
\\n         匹配的是文本\n
\\\\n       匹配的是文本\\n
#在python中 可以在字符串前加r取消转义
正则表达式实战建议
1.编写校验用户身份证号的正则
  \d{17}[\d|x]|\d{15}
2.编写校验邮箱的正则
  \w[-\w.+]*@([A-Za-z0-9][-A-Za-z0-9]+\.)+[A-Za-z]{2,14}
3.编写校验用户手机号的正则
  0?(13|14|15|17|18|19)[0-9]{9}
4.编写校验用户电话号的正则
  [0-9-()()]{7,18}
5.编写校验用户qq号的正则
  [1-9]([0-9]{5,11})

#很多时候有的正则已经有人帮我们做好了,只需要百度查到即可

re模块

在python中使用正则,re模块是 选择之一
1).re模块基本使用

1.findall 查找所有符合正则表达式要求的数据 结果直接是一个列表

# 在文本中筛选出符合a的所有内容,结果为列表
import re
res=re.findall('a','abcabca')
print(res)  # ['a', 'a', 'a']

2.finditer查找所有符合正则表达式要求的数据 结果直接是一个迭代器对象

import re
res=re.finditer('a','abcabca')
print(res)  # <callable_iterator object at 0x000001FFA8AD7220>
print(res.__next__())  # <re.Match object; span=(0, 1), match='a'>
print(res.__next__().group())  # a

3.search匹配到一个符合条件的数据就立刻结束

import re
res=re.search('a','abcabca')
print(res)  # <re.Match object; span=(0, 1), match='a'>
print(res.group())  #a

4.match从头开始匹配,如果头不符合就结束

import re
res=re.match('a','abcabca')
print(res)  # <re.Match object; span=(0, 1), match='a'>

res1=re.match('b','abcabca')
print(res1)  # None

5.compile提前准备好正则,后续可以反复使用减少代码的冗余

import re
obj=re.compile('a')
print(re.findall(obj,'abcabca'))  # ['a', 'a', 'a']
print(re.findall(obj,'asssdaada'))  # ['a', 'a', 'a', 'a']
print(re.findall(obj,'ddffee123a'))  # ['a']
2).re模块补充使用
(1)分组优先

1.findall分组优先展示:优先展示括号内正则表达式匹配到的内容

res=re.findall('www.(baidu|4399).com','www.4399.com')
print(res)  # ['4399']

2.取消分组优先展示(?😃

res=re.findall('www.(?:baidu|4399).com','www.4399.com')
print(res)  # ['www.4399.com']

3.search和match针对分组()里的正则表达式不影响

res=re.search('www.(baidu|4399).com','www.4399.com')
print(res.group())  # www.4399.com

res=re.match('www.(baidu|4399).com','www.4399.com')
print(res.group())  # www.4399.com
(2)分组别名
res=re.search('www.(?P<mingzi1>baidu|4399)(?P<mingzi2>.com)','www.4399.com')
print(res)  # <re.Match object; span=(0, 12), match='www.4399.com'>
print(res.group())  # www.4399.com
print(res.group(0))  # www.4399.com
print(res.group(1))  # 4399
print(res.group(2))  # .com
print(res.group('mingzi1'))  # 4399
print(res.group('mingzi2'))  # .com

9.网络爬虫

1)什么是互联网?
将全世界的计算机连接到一起组成的网络

2)互联网发明的目的是什么?
让连接到互联网的计算机数据彼此共享

3)上网的本质是什么?
基于互联网访问其他人计算机上共享数据(服务器存在的意义就是让其他人来访问)

4)网络爬虫的本质是什么?
通过编写代码模拟计算机浏览器朝目标网址发送请求获取数据并筛选出想要的数据

posted @ 2022-10-25 20:38  梅梅小可爱  阅读(33)  评论(0)    收藏  举报