正则表达式

正则表达式

概述
为什么要学习正则表达式

在实际开发过程中经常会有查找符合某些规则的字符串。

比如:邮箱、图片地址、手机号码等,想要匹配或者查找某些规则的字符串就可以使用正则表达式了。

正则表达式是什么

正则表达式(regular expression)描述了一种字符串匹配的模式,比如:

  1. 检索一个串是否含有某种子串(检索)
  2. 匹配的子串做替换(替换)
  3. 从一个串中取出符合某个条件的子串(提取)

**模式:**一种特定的字符串模式,这个模式是通过一些特殊的符号组成的。
正则表达式并不是Python特有的,在Java、PHP以及JavaScript等语言中都是支持正则表达式的。

正则表达式有哪些功能

功能

  1. 数据验证(表单验证,比如:手机号、邮箱、IP地址等)
  2. 数据检索(数据检索、数据抓取)=> 爬虫功能
  3. 数据隐藏(135****6235 号码隐藏)
  4. 数据过滤(论坛敏感词过滤)
  5. ...
re模块
re模块使用三步走

在python中需要通过正则表达式对字符串进行匹配时,可以使用re模块

复制代码
	 # 第一步:导入re模块
	 import re
	 # 第二步:使用match方法进行匹配操作
	 result = re.match(pattern正则表达式,string要匹配的字符串,flags=0)
	 # flags:可选,表示匹配模式,比如忽略大小写,多行模式等
	 # 第三步:如果数据匹配成功,使用group方法来提取数据
	 result.group()

正则表达式常用的函数:

  1. 用来做校验的,替换的函数

match() -》从左到右,逐个字符的匹配,不会跳过某个字符,即:全词匹配

search() -》从左到右,依次匹配,即:只要某部分满足条件即可

compile().sub() -》替换

  1. 用来获取数据值的函数

group() -》获取匹配到的第一个数据

正则表达式编写
匹配单个字符
表达式 功能
. 匹配任意1个字符(除了\n)
[] 匹配[]中列举的字符
[^指定字符] 匹配除了指定字符以外的所有字符
\d 匹配数字,即0-9
\D 匹配非数字,即不是数字
\s 匹配空白,即空格、tab键
\S 匹配非空白
\w 匹配非特殊字符,即a-z、A-Z、0-9、_、汉字
\W 匹配特殊字符,即非字母、非数字、非汉字
python 复制代码
import re

# 正则表达式匹配字符
print("正则表达式匹配字符")
result = re.match(r'.it', 'ait')  # 能匹配,返回的是正则对象
print(result)  # 输出匹配结果
print("正则表达式匹配字符2")
result3 = re.match(r'.it', 'aitb')  # 能匹配,返回的是正则对象
print(result3)  # 输出匹配结果

# 校验字符串是否包含ait,bit,cit,hit,git
print("\n校验字符串是否包含ait,bit,cit,hit,git")
result4 = re.match(r'[abchg]it', 'git')
print(result4)  # 输出匹配结果

# 校验字符串第一个字符,可以是除了a,b,c外任意一个字符,后两个字符必须是hm
print("\n校验字符串第一个字符,可以是除了a,b,c外任意一个字符,后两个字符必须是hm")
result5 = re.match(r'[^abc]hm', ' dhm')
print(result5)  # 输出匹配结果

# 匹配数字(\d)
print("\n匹配数字(\\d)")
result6 = re.match(r'\d', '1abc')
print(result6)  # 输出匹配结果

# 匹配非数字(\D)
print("\n匹配非数字(\\D)")
result7 = re.match(r'\D', 'a123')
print(result7)  # 输出匹配结果

# 匹配空白(\s)
print("\n匹配空白(\\s)")
result8 = re.match(r'\s', ' abc')
print(result8)  # 输出匹配结果

# 匹配非空白(\S)
print("\n匹配非空白(\\S)")
result9 = re.match(r'\S', 'abc ')
print(result9)  # 输出匹配结果

# 匹配非特殊字符(\w)
print("\n匹配非特殊字符(\\w)")
result10 = re.match(r'\w', 'a_1')
print(result10)  # 输出匹配结果

# 匹配特殊字符(\W)
print("\n匹配特殊字符(\\W)")
result11 = re.match(r'\W', '@a_1')
print(result11)  # 输出匹配结果
匹配多个字符
表达式 功能
* 匹配前一个字符出现0次或者无限次,即可有可无
+ 匹配前一个字符出现1次或者无限次,即至少有1次
? 匹配前一个字符出现1次或者0次,即要么有1次,要么没有
{m} 匹配前一个字符出现m次
{m,n} 匹配前一个字符出现从m到n次
python 复制代码
import re
#  *:匹配前一个字符出现0次或者无限次,即可有可无
print("\n*:匹配前一个字符出现0次或者无限次,即可有可无")
result_star = re.match(r'a*', 'aaa')  # 匹配 'a' 出现0次或多次
print(result_star)  # 输出匹配结果
# +:匹配前一个字符出现1次或者无限次,即至少有1次
print("\n+:匹配前一个字符出现1次或者无限次,即至少有1次")
result_plus = re.match(r'a+', 'aaa')  # 匹配 'a' 出现1次或多次
print(result_plus)  # 输出匹配结果
# ?:匹配前一个字符出现1次或者0次,即要么有1次,要么没有
print("\n?:匹配前一个字符出现1次或者0次,即要么有1次,要么没有")
result_question = re.match(r'a?', 'a')  # 匹配 'a' 出现0次或1次
print(result_question)  # 输出匹配结果
result_question_none = re.match(r'a?', 'b')  # 匹配 'a' 出现0次或1次
print(result_question_none)  # 输出匹配结果
# {m}:匹配前一个字符出现m次
print("\n{m}:匹配前一个字符出现m次")
result_exact = re.match(r'a{3}', 'aaa')  # 匹配 'a' 出现3次
print(result_exact)  # 输出匹配结果
# {m,n}:匹配前一个字符出现m到n次
print("\n{m,n}:匹配前一个字符出现从m到n次")
result_range = re.match(r'a{2,4}', 'aaaa')  # 匹配 'a' 出现2到4次
print(result_range)  # 输出匹配结果
匹配开头和结尾
表达式 功能
^ 匹配字符串开头
$ 匹配字符串结尾
python 复制代码
# ^:匹配字符串开头
print("\n^:匹配字符串开头")
result_start = re.match(r'^a', 'abc')  # 匹配字符串以 'a' 开头
print(result_start)  # 输出匹配结果
# $:匹配字符串结尾
print("\n$:匹配字符串结尾")
result_end = re.match(r'b$', 'ab')  # 匹配字符串以 'b' 结尾
print(result_end)  # 输出匹配结果
提取分组数据
表达式 功能
| 匹配左右任意一个表达式
(ab) 将括号中字符作为一个分组
\num 引用分组num匹配到的字符串
python 复制代码
import re

print("\n|:匹配左右任意一个表达式")
result_or = re.match(r'a|b', 'a')  # 匹配 'a' 或 'b'
print(result_or)  # 输出匹配结果

print("\n(ab):将括号中字符作为一个分组")
result_group = re.match(r'(ab)', 'ab')  # 将 'ab' 作为一个分组
print(result_group.group(0))  # 输出匹配结果

print("\n\\num:引用分组num匹配到的字符串")
result_ref = re.match(r'(ab)\1', 'abab')  # 引用分组1匹配到的字符串
print(result_ref)  # 输出匹配结果
扩展补充

#####正则的三种匹配方式

  1. match匹配方式
    语法格式:re.match(pattern, string, flags)
    参数:
    pattern:匹配的正则表达式
    string:要匹配的字符串
    flags:标志位(暂时忽略)
    功能:尝试从字符串起始位置匹配一个正则表达式
    1)如果不能从起始位置匹配成功,则返回None;
    2)如果能从起始位置匹配成功,则返回一个匹配的对象
  2. search匹配方式
    语法格式:re.search(pattern, string, flags)
    参数:
    pattern:匹配的正则表达式
    string:要匹配的字符串
    flags:标志位(暂时忽略)
    功能:根据正则表达式扫描整个字符串,并返回第一个成功的匹配
    1)如果不能匹配成功,则返回None;
    2)如果能匹配成功,则返回一个匹配对象
    3.findall匹配方式
    语法格式:re.findall(pattern, string, flags)
    参数:
    pattern:匹配的正则表达式
    string:要匹配的字符串
    flags:标志位(暂时忽略,后面会介绍)
    功能:根据正则表达式扫描整个字符串,并返回所有能成功匹配的子串
    1)如果不能匹配成功,则返回一个空列表;
    2)如果能匹配成功,则返回包含所有匹配子串的列表
贪婪模式和非贪婪模式
贪婪模式

在整个表达式匹配成功的前提下,尽可能多的匹配

非贪婪模式

在整个表达式匹配成功的前提下,尽可能少的匹配

正则中的量词:和+,默认都是贪婪模式的匹配,可以在他们后面加?将其变为非贪婪模式。
常用贪婪模式如: .

常用非贪婪模式如: .*?

正则标志修饰符

正则表达式可以包含一些可选标志修饰符来控制匹配的模式

修饰符被指定为一个可选的标志,多个标志可以通过按位 OR(|) 它们来指定。

修饰符 描述

re.I 匹配时不区分大小写

re.S 使 . 匹配包括换行符\n在内的所有字符

相关推荐
咩?10 分钟前
SEABORN库函数(第十八节课内容总结)
开发语言·python·matplotlib·seaborn
万粉变现经纪人10 分钟前
如何解决pip安装报错ModuleNotFoundError: No module named ‘transformers’问题
人工智能·python·beautifulsoup·pandas·scikit-learn·pip·ipython
浊酒南街30 分钟前
Pytorch基础入门1
pytorch·python
仪器科学与传感技术博士1 小时前
Matplotlib库:Python数据可视化的基石,发现它的美
开发语言·人工智能·python·算法·信息可视化·matplotlib·图表可视化
啾啾Fun2 小时前
PyTorch 核心三件套:Tensor、Module、Autograd
人工智能·pytorch·python
嫩萝卜头儿4 小时前
深入理解 Java AWT Container:原理、实战与性能优化
java·python·性能优化
爱吃芒果的蘑菇4 小时前
使用pybind11封装C++API
开发语言·c++·python
Smile_2542204184 小时前
散点图矩阵
python
BUG再也不见5 小时前
Python爬虫 urllib 模块详细教程:零基础小白的入门指南
开发语言·网络·爬虫·python