正则表达式

课题:正则表达式

独有的工具:用来匹配或者提取字符串

不属于Python基础。属于编程基础。

封装到库里边的,语法都是一样的。做好笔记,多敲。

Python---爬虫,WEB。没有其他的可以代替正则表达式

123456@163.com、url

import re
aaa='123456@163.com'
my = re.findall(r'^[a-zA-Z0-9]+@[a-zA-Z0-9]+\.com$',aaa)
# 去掉@或者cn  不能匹配到
# 通过自己写的规则,匹配想要的字符串
# python取消转义:\?    取消正则表达式语法的转义

知识点一:re模块

1、findall方法:

在字符串中找到正则表达式所匹配的所有子串,并返回一个列表
,如果没有找到匹配的,则返回空列表

2、match方法

re.match 尝试从字符串的起始位置匹配一个模式,匹配成功 返回的是一个匹配
对象(这个对象包含了我们匹配的信息),如果不是起始位置匹配成功的话,
match()返回的是空,

注意:match只能匹配到一个

a = "python123123java"
print(re.match('python',a))
print(re.match('python',a).group())# 查看匹配的字符
print(re.match('123',a))
print(re.match('python',a).span())# 匹配字符的下标取值区间

3、search方法

re.search 扫描整个字符串,匹配成功 返回的是一个匹配对象(这个对象包含了我们匹配的信息)

注意:search也只能匹配到一个,找到符合规则的就返回,不会一直往后找

print(re.search('123',a))# yes
print(re.search('cc',a))# None
print(re.search('python',a).group())
print(re.search('python',a).span())

re.match与re.search的区别:
re.match只匹配字符串的开始位置找,如果字符串开始不符合正则表达式,则匹配失败,
re.search:匹配整个字符串,如果一直找不到则,返回是空的,没有结果

4、元字符

单字符匹配

字符 描述
. 匹配任意1个字符(除了\n)
[] 匹配 [] 中列举的字符
\d 匹配数字,即0-9
\D 匹配非数字,即不是数字
\s 匹配空白,即 空格,tab键
\S 匹配非空白
\w 匹配单词符,即a-z、A-Z、0-9、_
\W 匹配非单词字符

代表数量的元字符

字符 描述
* 匹配前一个字符出现0次或者无限次,即可有可无
+ 匹配前一个字符出现1次或者无限次,即至少有1次
匹配前一个字符出现0次或者1次,即要么有1次,要么没有
匹配前一个字符出现m次
匹配前一个字符至少出现m次
匹配前一个字符出现从m到n次

代表边界的元字符

字符 描述
^ 匹配字符串开头
$ 匹配字符串结尾
\b 匹配一个单词的边界

分组匹配

字符 描述
| 匹配左右任意一个表达式
(ab) 将括号中的字符作为一个分组
b = '张三天在玩4399小游戏,张三 hello 玩的.很开心'
ress = re.findall(r'张三.',b)# .任意一个字符
ress1 = re.findall(r'[54]',b)
ress1 = re.findall(r'\d',b)# 匹配数字,单个字符,单个元素
ress1 = re.findall(r'\D',b)#
ress1 = re.findall(r'4*',b)# 匹配前一个字符出现0次或者无限次,即可有可无
ress1 = re.findall(r'4+',b)# 匹配前一个字符出现1次或者无限次,即可有可无
ress1 = re.findall(r'三{2}',b)# 匹配前一个字符出现m次
ress1 = re.findall(r'三{1,}',b)# 匹配前一个字符出现从m到n次
ress1 = re.findall(r'三{1,2}',b)# 匹配前一个字符出现从m到n次
ress1 = re.findall(r'^张三',b)# 匹配字符串开头
ress1 = re.findall(r'心$',b)# 匹配字符串结尾
ress1 = re.findall(r'\bhello\b',b)# 匹配一个单词的边界
ress1 = re.findall(r'he\Bll',b)# 匹配一个单词的边界
ress1 = re.findall(r'he\Bll',b)# 匹配一个单词的边界
print(ress1)

5、贪婪和非贪婪

正则默认都是用贪婪模式去匹配数据的,就是尽可能多的匹配符合要求的数据,

在非贪婪模式下,始终找最短匹配

a = '<img src = "xiaomeimei.jpg" alt="这是图片">'
b = '<html>000</html><td>ddd</td>'
print(re.findall(r'<.*>',b))# 贪婪
print(re.findall(r'<.*?>',b))# 加上?变成非贪婪
print(re.findall(r'-(\d+)(.+-)','-123456789-'))
print(re.findall(r'-(\d+?)(.+-)','-123456789-'))
import re

aa = '<img src="https://rpic.douyucdn.cn/live-cover/roomCover/2019/02/14/7205b97c8db9ddf9109153f294f14b21_big.jpg?x-oss-process=image/format,webp" class="DyImg-content is-normal ">'
a = re.search(r"https://.*?\.jpg", aa)
b = a.group()

import requests
rc = requests.get(b)
qiye = rc.content
with open('test.jpg', 'wb') as f:
    f.write(qiye)
    
--------------------------------------
a = '''<img src="https://img.tupianzj.com/uploads/allimg/202005/9999/184cb9395c.jpg" id="bigpicimg" alt="">'''

b = re.findall(r'src="(https:.*?\.jpg)"', a)
# qiye = re.findall(r'<img src="(.*?\.jpg)"', a)
r'<img src="([^"]+\.jpg)"'
print(b)


import requests
rc = requests.get(b[0])
qiye = rc.content
with open('test.jpg', 'wb') as f:
    f.write(qiye)
--------------------------------------------
import re

# 1----9     \d
# 10----99    [1-9]\d
# 100----199   1\d{2}
# 200----249   2[0-4]\d
# 250---255    25[0-5]
for i in range(256):
    a = str(i)

    a = re.match(r"^(25[0-5]|2[0-4]\d|1\d{2}|[1-9]\d|\d)$", a)
    print(a.group())
------------------------------------------
手机号
bb = '18390970027'
bbb = re.match(r'1[35678]\d{9}',bb)
print(bbb.group())
posted @ 2023-08-31 21:27  csh逐梦  阅读(40)  评论(0编辑  收藏  举报