py基础:正则表达式、re模块

一、正则表达式

# 案例:京东注册手机号校验
while True:
    # 1 获取手机号码的输入
    phone_num = input('请输入您的手机号码:').strip()
    # 2 判断手机号是否符合要求
    if len(phone_num) == 11:
        if phone_num.isdigit():
            if phone_num.startswith('13') or phone_num.startswith('15') or phone_num.startswith(
                    '18') or phone_num.startswith('19') or phone_num.startswith('17'):
                print('手机号码格式正确')
            else:
                print('手机开头不对')
        else:
            print('手机号必须是纯数字')
    else:
        print('手机号必须是纯数字')

"""可以看出用python代码来进行判断的确可行,但并不简介和方便"""                      
  • python结合正则表达式
"""
导入re模块使用正则表达式,但是并非使用正则表达式就一定要使用re模块,
也有其他但模块可以使用正则表达式
"""
import re

phone_num = input('请输入您的手机号码:').strip()

"""
^(13|15|17|18|19)[0-9]{9}$ 
意思是开头是 13 or 15 or 17 or 18 or 19,
并且后面的9位数字是0-9中的数字,一共11位
"""
if re.match('^(13|15|17|18|19)[0-9]{9}$',phone_num):
    print('您的手机号码格式正确')
else:
    print('您的手机号码格式不正确')
  • 什么是正则表达式
1.正则表达式简介:
    正则表达式是一门独立的技术,所有编程语言都可以使用。它的作用可以简单的概括为:利用一些特殊符号(也可以直接写需要查找的具体字符)的组合产生一些特殊的含义然后去字符串中筛选出符合条件的数据

2.正则表达式作用:
    筛选数据(匹配数据)

二、字符组

字符组默认匹配方式是挨个挨个匹配

字符组 匹配字符 用法说明
字符组 [0123456789] 匹配0-9任意一个数(全写)
数字 [0-9] 匹配0-9任意一个数(缩写)
小写英文字母 [a-z] 匹配26个小写英文字母
大写英文字母 [A-Z] 匹配26个大写英文字母

字符组内所有数据默认都是或or的关系

三、特殊符号

特殊符号默认匹配方式是挨个挨个匹配

特殊符号 用法说明
. 点号 匹配出换号赋意外的任意字符(默认匹配一个)
\w 匹配数字、字母、下划线
\W 匹配非数字、非字母、非下划线
\d 匹配数字
^ 匹配字符串的开头
$ 匹配字符串的结尾
^和$结合使用 可以精确的限制匹配的内容
a|b 匹配a或者b
() 给正则表达式分组,不影响表达式的匹配功能
[] 字符组 内部填写的内容默认都是或的关系
[^] 去反操作,匹配出来字符组字母的其他所有字符

上尖号在中括号内[^]中括号[]意思完全不同

四、量词

正则表达式默认情况下,都是贪婪匹配(也就是尽可能多的匹配)

量词 用法说明
* 匹配零次或者多次(默认多次,无穷大)
+ 匹配一次或者多次(默认多次,无穷大)
? 匹配零次或一次 作为量词意义不大,主要用于非贪婪匹配
重复n次
重复n次或者更多次(默认多次,无穷大)
重复n次至m次(默认m次)

量词的用法注意:

1 量词必须结合表达式一起使用,不能单独出现
2 并且量词只影响左边第一个表达式

五、课堂练习

1 . ^ $的使用

正则例子 待匹配字符 匹配结果 说明
亚. 亚索亚细亚亚洲亚军 亚索 亚细 亚亚 亚军 .代表了一个字符,
只要要匹配的字符后面出现一个亚字,则立马匹配到
^亚. 亚索亚细亚亚洲亚军 亚索 ^表示了只匹配开头的一个亚字
亚.$ 亚索亚细亚亚洲亚军 亚军 $表示了只匹配结尾的一个亚字和一个字符

2 * + ? {}

正则例子 待匹配字符 匹配结果 说明
亚.? 亚索在亚细亚和在亚洲获得了亚军 亚索 亚细 亚和 亚洲 亚军 ?表示重复一次(可以匹配不到),只匹配亚后面的一个字符
亚.* 亚索在亚细亚和在亚洲获得了亚军 亚索在亚细亚和在亚洲获得了亚军 *表示重复无数次,默认是贪婪匹配,所以后面的都要
亚.+ 亚索在亚细亚和在亚洲获得了亚军 亚索在亚细亚和在亚洲获得了亚军 +表示重复一次或更多次,尽可能少次的匹配,默认是贪婪匹配
亚.{1,2} 亚索在亚细亚和在亚洲获得了亚军 亚索在 亚细亚 亚洲获 亚军 {1,2}表示匹配1到2个任意字符,优先大括号后面的数字次数

六、贪婪匹配与非贪婪匹配

所有的量词都是贪婪匹配,如果想要变为非贪婪匹配,只需要在量词后面加问号即可

1.贪婪匹配
  在满足匹配条件的情况下(左右两端有限制的话只要满足限制条件),匹配尽可能长的字符串
# 案例
待匹配的文本
  <script>alert(123)</script>
待使用的正则(贪婪匹配)
  <.*>
匹配的结果
  <script>alert(123)</script>  # 尽管有<>的限制,左右两端满足条件,则中间都可以匹配进来

2.非贪婪匹配
  加?来改变贪婪匹配,这时只匹配一次就结束匹配
# 案例
待匹配的文本
  <script>alert(123)</script>
待使用的正则(贪婪匹配)
  <.*?>
匹配的结果
  <script> 

七、转义符

斜杠与字母的组合有时候有特殊含义

\n      匹配的是换行符
\\n     匹配的是\n
\\\\n   匹配的是\\n

如果是在python中还可以在字符串前面加r来取消转义

  • python中学到的字符串前面加字母表达的含义
1.f'' 格式化输出字符串,搭配{}使用,可以动态格式化输出内容
  
2.r'' 在路径的字符串前加上r,可以用来取消转义
  
3.u'' 在python 2.x 中如果想用utf系列的字符编码,可以在字符串前面加上字母u作以提醒。防止因为源码储存格式问题,导致再次使用时出现乱码。
  
4.b'' 表示后面的字符串是 bytes类型  # 网络编程中,服务器和浏览器只认bytes 类型数据
例: response = b'<h1>Hello World!</h1>'     # b' ' 表示这是一个 bytes 对象

八、正则表达式实战应用

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.编写校验邮箱的正则
    \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}
   座机号:[0-9-()()]{7,18}
4.编写校验用户qq号的正则
   腾讯qq号:[1-9]([0-9]{5,11})

九、re模块

1.re模块的作用

在python中如果想要使用正则,可以考虑re模块  
# 但是正则不是只有re模块

2.常见操作方法

1.re.findall('要查找的数据','数据集')
查找所有符合正则表达式要求的数据,结果直接是个列表

# 举例
s1 = "Cause I'm about to get into my feelings"
res1 = re.findall('a', s1)
print(res1)  # ['a', 'a']

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

# 举例
s1 = "Cause I'm about to get into my feelings"
res1 = re.finditer('a',s1)
print(res1)  # <callable_iterator object at 0x103130670>

3.re.search()
# 看结果需要用 .group()方法 ,匹配到一个符合条件的数据就立刻结束

# 举例
s1 = "Cause I'm about to get into my feelings"
res = re.search('a', s1)
print(res)  # <re.Match object; span=(1, 2), match='a'>
print(res.group())  # a


4.re.match()
匹配字符串的开头,一个就结束,如果不符合则后面不匹配了,返回None

# 举例
s1 = "Cause I'm about to get into my feelings"
res = re.match('a', s1)
print(res)  # None

5.re.compile()
当某一个正则表达式需要频繁使用的时候,我们可以做成模版

# 举例
obj = re.compile('\d{3}')
res1 = obj.findall('23423422342342344')
res2 = obj.findall('asjdkasjdk32423')
print(res1, res2)  # ['234', '234', '223', '423', '423'] ['324']

6.re.split
ret = re.split('[ab]', 'abcd')  
# 先按'a'分割得到''和'bcd',在对''和'bcd'分别按'b'分割
print(ret)  # ['', '', 'cd']

7.re.sub
ret = re.sub('\d', 'H', 'eva3jason4yuan4', 1)  
# 将数字替换成'H',参数1表示只替换1个
print(ret)  # evaHjason4yuan4


8.ret = re.sub
ret = re.sub('\d', 'H', 'eva3jason4yuan4', 1)  
# 将数字替换成'H',参数1表示只替换1个
print(ret)  # evaHjason4yuan4

3.re模块补充说明

1.分组优先
# findall 分组优先展示:优先展示括号内正则表达式匹配到的内容
# 括号最前面加上(?:)可以取消优先展示内容

# 举例
res = re.findall('www.(baidu|douban).com', 'www.douban.com')
print(res)  # ['douban']
# findall分组优先展示:优先展示括号内正则表达式匹配到的内容
res = re.findall('www.(?:baidu|douban).com', 'www.douban.com')
print(res)  # ['www.douban.com']


2.分组别名
  在括号内用(?P<别名>) 可以为正则其别名,通过group(别名)方法得到想要的想要的内容


res = re.search('www.(baidu|douban).com', 'www.douban.com')
print(res)  # <re.Match object; span=(0, 14), match='www.douban.com'>

res = re.search('www.(?P<aaa>baidu|douban).(?P<bbb>com)', 'www.douban.com')
print(res.group('aaa'))  # douban

十、网络爬虫简介

网络爬虫:通过编写代码模拟浏览器发送请求获取数据并按照自己指定的要求筛选出想要的数据
posted @ 2022-10-25 16:41  Duosg  阅读(97)  评论(0编辑  收藏  举报