正则表达式的基本语法

元字符:具有固定含义的特殊字符

常用元字符:

1:. 匹配除换行符以外的任意一个字符,在python的re模块中是一个坑

2:\w 匹配字母或数字或下划线

3:\s 匹配任意的空白符

4:\d 匹配任意1个数字

5:\n 匹配一个换行符

6: \t 匹配一个制表符

7:^ 匹配字符串的开始

8:$ 匹配字符串的结尾

9:\W 匹配非字母或数字或下划线

10:\D匹配非数字

11:\S匹配非空白符

12:| 表示或者的意思 例:a|b 匹配字符 a或b

13:() 匹配括号内的表达式,也表示一个组 类似数学中的小括号的含义

14: 匹配括号内的表达式 例:[abcde] 就是匹配 a 匹配b 匹配c 匹配d 匹配e 也可以[a-zA-Z0-9] 形式 进行匹配表示匹配所有字母和数字

15:[^] 匹配除了字符组中字符的所有字符

量词:控制前面元字符出现的次数

1: 重复零次或更多次 会往最多的匹配 比如\d 进行匹配时 10000 只会匹配出10000 而不是 1 0 10 100 1000 10000

2:+重复一次或更多次 也是会往最多的匹配

3:? 重复零次或一次 \d? 进行匹配时 10000 匹配的就是 1 0 0 0 0

4:{n} 重复n次 用来限定匹配重复多少次的 比如用来匹配手机号 :\d{11}

5 :{n,} 重复n次或者更多次

6:{n,m} 重复n到m次

贪婪匹配和惰性匹配

1:.* 贪婪匹配 尽可能多的进行匹配 例:我要玩游戏而且我只爱玩单机游戏你也爱玩吗 我.游戏 匹配出的结果就是:“我要玩游戏而且我只爱玩单机游戏”

2:.*?惰性匹配 尽可能少的进行匹配 同样是上面例子 匹配的结果就是 “我要玩游戏”和“我只爱玩单机游戏”

正则表达式在Python中的使用方法

re模块

re模块是python自带的正则表达式模块,可以直接同 import re 进行引入

import re

result=re.findall(r"正则表达式","字符串内容")\\由于转义字符的问题 一般会使用 r""来忽视转义来减少麻烦
例:re.findall(r"\d+","我今年18,身高180") 返回的结果是列表形式的结果

result=re.finditer((r"\d+","我今年18,身高180")  \\返回的是一个迭代器结果
for item in result: \\从迭代器中拿内容
print(item.group()) \\从匹配到的结果中拿数据 这一个用的比较多,因为使用了迭代器提升了程序的执行效率

result=re.search(r"\d+",“我叫阿修,今年18岁,身高180”)//search只会匹配到第一次匹配到的内容
print(result.group())


re.match(r"\d+",“我叫阿修,今年18岁,身高180”)  //match,在匹配时候是从字符串的开头进行匹配的,类似在正则前面加上了^
//用的较少//match也是匹配到第一个匹配到的内容就返回

在实际应用过程过程中我们会遇到同一个正则表达式被多次使用,这势必会造成资源的损耗比如:
for item in xxxxx:
re.findall("xxx","xxx")
那么这个时候就可以使用预加载来解决问题  预加载,提前把正则对象加载完毕
例:
    obj=re.compile(r"正则表达式")
    for item in xxxxx:
        obj.finditer(item)
    当然不是循环调用也是可以用预加载的 比如:obj.findall("我叫阿修,今年18岁,身高180")
    
    
   

通过re提取分组数据
import re
s="""
<div class='abc'><span id='10001'>中国移动</span></div>
<div class='abc'><span id='10002'>中国电信</span></div>        
"""
res=re.findall(r"<span id='\d+'>.*?</span>",s)
print(res),
//可以发现提取出的结果是["<span id='10001'>中国移动</span>", "<span id='10002'>中国电信</span>"],那么如果只是想要提取出10001中国移动 10002中国电信 这两组有用的信息该怎么办呢,只需将re语句加上小括号即可

res=re.findall(r"<span id='(\d+)'>(.*?)</span>",s)
print(res)  

//但是如果提取时想要将 10001和10002分为一组,中国移动和中国电信分为一组方便数据管理又该怎么办呢,这时就需要在re语句中对这两处分别进行设置名字且需要使用.finditer进行提取
res=re.finditer(r"<span id='(?P<num>\d+)'>(?P<name>.*?)</span>",s)
for item in res:
num=item.group("num")
print(num)
name=item.group("name")
print(name)
关于.的使用的细节补充

由于用.进行匹配时是无法匹配换行符的,但日常网页提取时,很多标签之间都是有换行出现的,那么这时候就会产生问题,如何来能将换行符匹配进来呢,比较常用的方法是使用re.S来进行解决

例:
res=re.finditer(<a target="_blank" href=".*?">(?P<name>.*?)</a>',response.text,re.S)
最后修改:2023 年 08 月 20 日
如果觉得我的文章对你有用,请随意赞赏