![5d7d0606ab0a005b91c4fba46fbb0d63.png](https://i-blog.csdnimg.cn/blog_migrate/5e67aba6453c2257e44fa0f57771bf92.jpeg)
正则表达式
- 一种字符串匹配模式
- 简约的表达了字符串的形式
# 导入正则模块
import re
msg = "娜扎热巴黛丝佟丽娅"
# 使用正则模块的方法:match
result=re.match("佟丽娅",msg) # 第一个参数是要匹配的内容,第二个参数是匹配源
print(result)
"""为什么会是None?
因为match是从头进行匹配,然后到尾
佟丽娅只是在其中,不符合规则
"""
None
'为什么会是None?n 因为match是从头进行匹配,然后到尾n 佟丽娅只是在其中,不符合规则n'
msg="佟丽娅"
result = re.match("佟丽娅",msg)
print(result) # 这样才行,match是对整体的判断
<re.Match object; span=(0, 3), match='佟丽娅'>
# search 方法的使用
msg = "娜扎热巴黛丝佟丽娅"
# 使用正则模块的方法:match
result=re.search("佟丽娅",msg) # 第一个参数是要匹配的内容,第二个参数是匹配源
print(result) # search方法是对内部进行匹配,符合即可
print(result.span()) # 返回的匹配的位置
print(result.group()) # 返回的是匹配的数据
<re.Match object; span=(6, 9), match='佟丽娅'>
(6, 9)
佟丽娅
# 正则:[] 表示的是一个范围,比如[1-9]表示的就是1-9之间的任何一个数字
msg = "sd12neie9dehf90jhed0ej9ehe9e"
# 比如,我们现在要提取上面msg中 前后是字母,中间是数字的字符串
result = re.search("[a-z][1-9][a-z]",msg)
print(result)
print(result.group())
# 我们这里可以看到,是匹配到了,但是它并不是很全,因为search匹配到一个就会停止
# 此时我们需要用findall
result = re.findall("[a-z][1-9][a-z]",msg)
print(result) # 可以看到匹配全了,findall返回的是一个列表
<re.Match object; span=(7, 10), match='e9d'>
e9d
['e9d', 'j9e', 'e9e']
# 正则: * + ? 用于验证次数 分别是>=0 >=1 0或1 次
# 正则:{n} 用于验证前面的匹配就是n次
# 正则:{n,} 用于验证前面的匹配是n次到多次(大于n)
# 正则:{n,m} 用于验证前面的匹配是n到m次
# 正则:$对应的匹配是结尾
# 正则:^对应的匹配的开头
# 可能有些抽象,举个例子大家就能看懂了
# 比如 我们现在需要验证一个qq号码
# qq号码的规则是5到11位,开头不能是0
qq="32414234453"
# 如何用正则去验证呢,上面三种方法都可以
result = re.search("^[1-9][0-9]{4,10}$",qq) # ^[1-9]表示开头1-9任意数字的匹配,[0-9]{4,10}$ 表示对结尾出现4-10次的0-9数字的匹配
print(result) # 便能知道匹配结果
print(result.group())
print("-------------------------------")
result1 = re.match("[1-9][0-9]{4,10}",qq) # match默认就是对整体匹配,所有可以省略^和$的开头和结尾的固定
print(result1)
print(result1.group())
print("------------------------------------")
result2= re.findall("^[1-9][0-9]{4,10}$",qq)
print(result2)
<re.Match object; span=(0, 11), match='32414234453'>
32414234453
-------------------------------
<re.Match object; span=(0, 11), match='32414234453'>
32414234453
------------------------------------
['32414234453']
# 例子:匹配一个用户名,不能以数字开头,6位以上,数字或字母
username="jack007"
result = re.match("[a-zA-Z][0-9a-zA-Z]{5,}",username)
print(result.group())
print("------------------")
result1=re.search("^[a-zA-Z]w{5,}$",username) # w 就相当于[0-9a-zA-Z],包括所有字母和数字
print(result1.group())
print("-----------------------")
result2= re.findall("^[a-zA-Z]w{5,}$",username)
print(result2)
jack007
------------------
jack007
-----------------------
['jack007']
# 正则:b 表示匹配边界 空格啊,换行什么的
# 正则: . 表示匹配任意字符 出了n 换行符
msg="""a.py b.py c.py
dd.txt"""
result=re.findall(r"w{1,}.w{1,}b",msg)
print(result)
['a.py', 'b.py', 'c.py', 'dd.txt']
# 补充:s 匹配空白内容
# d 匹配任意数字,相当于[0-9]
- 分组操作,在一个匹配源里布置多个匹配项
# 例子 匹配 0-100
n="100"
n2=re.match("[1-9]?dd",n)
print(n2)
print("---------------")
n1 = re.match("[1-9]?d?$|100$",n) ## (word|word|word) 或者关系,表示的是单词整体间的或者
print(n1)
<re.Match object; span=(0, 3), match='100'>
---------------
<re.Match object; span=(0, 3), match='100'>
# 例子:匹配所有邮箱
email="322121321@qq.com"
# 常见邮箱有qq 163 126
result = re.match(r"w{5,20}@(qq|163|126).com",email)
print(result)
<re.Match object; span=(0, 16), match='322121321@qq.com'>
# 电话号码
phone = "010-98739249"
result = re.match(r"(d{3})-(d{8})",phone)
print(result)
print(result.group(1))
print(result.group(2)) # () 括号就表示分组,这是默认分组
<re.Match object; span=(0, 12), match='010-98739249'>
010
98739249
msg = '<html>abc</html>'
result = re.match(r"<(w+)>(.+)</1>",msg) # 这里的1表示和第一个括号里匹配的内容是一样的,但是需要来转译一下
print(result)
print(result.group(1))
print(result.group(2))
print(result.groups())
<re.Match object; span=(0, 16), match='<html>abc</html>'>
html
abc
('html', 'abc')
# 起名,当分组比较多的时候,我们需要用名字来区分
msg = '<html><h1>abc</h1></html>'
result=re.match(r'<(?P<name1>w+)><(?P<name2>w+)>(.+)</(?P=name2)></(?P=name1)>',msg)
print(result)
print(result.group(1))
print(result.groups())
<re.Match object; span=(0, 25), match='<html><h1>abc</h1></html>'>
html
('html', 'h1', 'abc')
- 替换,匹配需要替换的字符串,然后替换
# 正则表达式 替换字符串 替换源
result = re.sub(r"d+","8932","java:82,python:43")
print(result)
java:8932,python:8932
def func(temp):
num = temp.group()
num1 = int(num)+1
return str(num1)
# 此处也可以放一个定义好的函数
result = re.sub(r"d+",func,"java:82,python:43")
print(result)
java:83,python:44
- 切割
# 切割字符串 源
tt = re.split(r"[,:]", "java:90,python:100") # 切割
print(tt)
['java', '90', 'python', '100']
数量词默认是贪婪的,即尽可能的去匹配多的字符串
非贪婪模式则相反,尽可能少的去匹配
如何要将贪婪转化为非贪婪模式,需要加上一个问号即可
# 小练手
import requests
url = "http://pic.netbian.com/4kmeishi/"
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36"}
response = requests.get(url=url, headers=headers)
response.encoding = response.apparent_encoding
tupian = re.findall('<img src="(.+?)"', response.text)
print(tupian)
['/uploads/allimg/181223/205433-154556967383ec.jpg', '/uploads/allimg/180726/192028-153260402827c6.jpg', '/uploads/allimg/171226/100652-1514254012c82a.jpg', '/uploads/allimg/171219/191722-15136822427df2.jpg', '/uploads/allimg/171212/195515-1513079715ce91.jpg', '/uploads/allimg/171212/185016-15130758160ca1.jpg', '/uploads/allimg/171031/102603-1509416763dc8e.jpg', '/uploads/allimg/171031/103848-1509417528c452.jpg', '/uploads/allimg/170930/104047-15067392471602.jpg', '/uploads/allimg/170926/142947-15064073874c26.jpg', '/uploads/allimg/171020/212246-15085057660f48.jpg', '/uploads/allimg/170920/182032-1505902832c4e4.jpg', '/uploads/allimg/170915/191948-15054743881ece.jpg', '/uploads/allimg/170912/172118-15052080784f3d.jpg', '/uploads/allimg/170912/170047-15052068474420.jpg', '/uploads/allimg/170909/170543-1504947943b3aa.jpg', '/uploads/allimg/170904/213555-1504532155031f.jpg', '/uploads/allimg/170904/213437-1504532077b131.jpg', '/uploads/allimg/170706/183707-1499337427f494.jpg', '/uploads/allimg/170702/220717-14990044374be0.jpg', '/uploads/allimg/170718/170400-150036864055b2.jpg', '/d/file/2019/01/08/180006FTDaf.gif']
转载于
### 正则表达式 - 张snowball - 博客园www.cnblogs.com
谢谢收看
![45fe0db59b09766d2c342273d575a2b3.png](https://i-blog.csdnimg.cn/blog_migrate/517f6b61eeaaacf412eaeadbe08f257f.jpeg)