正则表达式简介

正则表达式简介

定义:

正则表达式(Regular Expression)是一种用于描述文本模式(pattern)的形式语言。它由字符和操作符构成,用于匹配、搜索和编辑文本。正则表达式可以用来在文本中查找特定模式的字符串,例如检查一个字符串是否符合特定的格式、提取字符串中的特定部分、替换文本中的指定内容等

主要的一些应用场景

  1. 文本搜索和替换:用于在文本中查找特定的模式或者替换特定的字符串。
  2. 数据验证:用于验证输入数据是否符合指定的格式,比如邮箱地址、电话号码、身份证号码等。
  3. 数据提取:用于从文本中提取特定的信息,比如从网页中提取链接、从日志中提取关键信息等。
  4. 数据处理:用于对文本进行分割、合并、格式化等操作。
  5. 编程语言中的模式匹配:许多编程语言都支持正则表达式,用于在程序中进行模式匹配和文本处理。

在python中使用正则表达式

常见的re模块函数

在python中我们通常需要去导入外部re模块的部分功能,如下:

函数 说明
match() 从一个字符串的开始位置起匹配正则表达式,返回Match对象
search() 在一个字符串中搜索匹配正则表达式的第一个位置,返回Match对象
findall() 搜索字符串,以列表类型返回全部能匹配的子串
compile() 编译正则表达式,返回Pattern对象
split() 将一个字符串按照正则表达式匹配结果进行分割,返回列表类型
sub() 在一个字符串中替换所有匹配正则表达式的子串,返回替换后的字符串
python 复制代码
str1='hello world'
res=re.match('hell',str1) # match() 在起始位置匹配
res1=re.match('e',str1)
print(res)
print(res1)

res=re.search('l',str1) # search()只匹配一次
print(type(res))

res=re.findall('l',str1) # findall()返回一个列表 匹配所有符合规则的字符
print(res)

pattern = re.compile('a') # compile()用于编译正则表达式
data = pattern.search('123abc')
print(data)
data1=pattern.match('ass')
print(data1)

res=re.split('h','afhsshughduaih') # spilt()切割字符串 返回列表
print(res)

res=re.sub('l','909',str1,1) # 新字符 旧字符 替换的字符串 替换次数
print(res)

元字符的使用

元字符 匹配内容
. 匹配除换行符以外的任意字符
\w 匹配所有普通字符(数字、字母或下划线)
\s 匹配任意的空白符:包括空格、制表符(Tab)、换行符、回车符等
\d 匹配数字
\W 匹配非字母或数字或下划线
\D 匹配非数字
\S 匹配非空白符
() 正则表达式分组所用符号,匹配括号内的表达式,表示一个组。
[...] 匹配字符组中的字符
[^...] 匹配除了字符组中字符的所有字符
^ 匹配字符串的开始位置,不匹配任何字符串
$ 匹配字符串的结尾位置,不匹配任何字符串

a|b:匹配字符a或字符b

python 复制代码
res=re.findall('\w','js_s1\tf4 ?6i\ng.joi1')
print(res)
res=re.findall('\W','js_s1\tf4 ?6i\ng.joi1')
print(res)
res=re.findall('\d','js_s1\tf4 ?6i\ng.joi1')
print(res)
res=re.findall('\D','js_s1\tf4 ?6i\ng.joi1')
print(res)
res=re.findall('\s','js_s1\tf4 ?6i\ng.joi1')
print(res)
res=re.findall('\S','js_s1\tf4 ?6i\ng.joi1')
print(res)


res=re.findall('^\w','js_s1\tf4 ?6i\ng.joi1')
print(res) # 输出j
res=re.findall('\w$','js_s1\tf4 ?6i\ng.joi1')
print(res) # 输出1


res=re.findall('\w{2}','js_s1\tf4 ?6i\ng.joi1') # {m,n}精确范围数量
print(res) # 输出['js', '_s', 'f4', '6i', 'jo', 'i1']
res=re.findall('\w{2,5}','js_s1\tf4 ?6i\ng.joi1')
print(res) # 输出['js_s1', 'f4', '6i', 'joi1']

贪婪匹配和非贪婪匹配

贪婪匹配 :在贪婪匹配模式下,量词会尽可能多地匹配文本。例如,*+ 是贪婪的,它们会尽可能多地匹配字符。例如,正则表达式 \w+ 会尽可能多地匹配连续的字母数字字符和下划线,直到遇到非字母数字字符或字符串结束。

非贪婪匹配 :在非贪婪匹配模式下,量词会尽可能少地匹配文本。为了将量词变为非贪婪的,可以在量词后面加上 ?。例如,*?+? 将匹配尽可能少的字符。非贪婪匹配适用于需要匹配最短可能字符串的情况,或者在量词后面紧跟一个其他匹配条件时。

python 复制代码
#贪婪匹配
res=re.findall('\w{2,}','js_s1\tf4 ?6i\ng.joi1 9807655566') #{m,}范围最小到范围无限大
print(res)
res=re.findall('\w+','js_s1\tf4 ?6i\ng.joi1') # + 相当于 {1,}
print(res)
res=re.findall('\w*','js_s1\tf4 ?6i\ng.joi1') # * 相当于 {0,}
print(res)

#非贪婪匹配
res=re.findall('\w','js_s1\tf4 ?6i\ng.joi1')
print(res)
res=re.findall('\w*?','js_s1\tf4 ?6i\ng.joi1')
print(res)
res=re.findall('\w+?','js_s1\tf4 ?6i\ng.joi1')
print(res)

# 万能公式 .*? 的使用
url='https://book.douban.com/tag/%E5%B0%8F%E8%AF%B4'
headers={'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Safari/537.36 Edg/121.0.0.0'}
response=requests.get(url,headers=headers).text
# print(response)
pat='<img class="" src="(.*?)"'
result=re.findall(pat,response)
print(result)
相关推荐
站大爷IP5 分钟前
Python多线程与多进程性能对比:从原理到实战的深度解析
python
东方佑14 分钟前
Python音频分析与线性回归:探索声音中的数学之美
python·音视频·线性回归
爱学习的小道长2 小时前
Python 比较huggingface_hub库的hf_hub_download函数和snapshot_download函数
开发语言·python
传奇开心果编程2 小时前
【传奇开心果系列】Flet框架实现的图形化界面的PDF转word转换器办公小工具自定义模板
前端·python·学习·ui·前端框架·pdf·word
竹子_232 小时前
《零基础入门AI: 目标检测基础知识》
人工智能·python·目标检测·计算机视觉
aFakeProgramer3 小时前
使用 ROS2 构建客户端-服务器通信:一个简单的计算器示例
开发语言·python·ros2
jinlei20094 小时前
在python 代码中调用rust 源码库操作步骤
开发语言·python·rust
mit6.8244 小时前
[Sync_ai_vid] 唇形同步评判器 | 图像与视频处理器 | GPU测试
人工智能·python
float_六七5 小时前
Apache Commons Lang 3
开发语言·python·apache
栒U5 小时前
从高层 PyTorch 到中层 CUDA Kernel 到底层硬件 Tensor Core
人工智能·pytorch·python