Python学习第十三天

ops/2025/3/15 0:14:06/

正则表达式

        什么是正则表达式:简单来说就是通过特殊符号匹配想要的字符串,正则表达式本身就是基于字符串的一套搜索规则,掌握了正则表达式对于字符串有了更深的把握和理解。

概念

        官网概念:正则表达式(Regular Expression,简称regex或regexp)是一种用于匹配字符串的模式。它由一系列字符和元字符组成,可以用来检查一个字符串是否包含某种模式、替换字符串中的某些部分,或者从字符串中提取符合某种模式的子串。Python中的正则表达式通过re 模块提供支持。

应用

  • web应用(密码校验、用户名校验、邮箱校验)

  • 网络爬虫

写法

        r'字符或者元字符'

        注意不要丢了r,r丢了就不是正则表达式了(比如\是元字符,加r就是告诉计算机这个是正则表达式不要给我转义)

构成

  • 普通字符:如字母、数字、空格等,它们匹配自身。

  • 元字符:具有特殊意义的字符,用于定义匹配模式。

常见元字符

元字符描述
.匹配除换行符以外的任意单个字符。
^匹配字符串的开头。
$匹配字符串的结尾。
*匹配前面的字符 0 次或多次。
+匹配前面的字符 1 次或多次。
?匹配前面的字符 0 次或 1 次。
{n}匹配前面的字符恰好 n 次。
{n,}匹配前面的字符至少 n 次。
{n,m}匹配前面的字符至少 n 次,至多 m 次。
\d匹配任意数字字符,等价于 [0-9]
\D匹配任意非数字字符,等价于 [^0-9]。                                
\w匹配任意字母、数字或下划线字符,等价于 [a-zA-Z0-9_]
\W匹配任意非字母、数字或下划线字符,等价于 [^a-zA-Z0-9_]
\s匹配任意空白字符(包括空格、制表符、换行符等)。
\S匹配任意非空白字符。
[]匹配括号内的任意一个字符。例如 [abc] 匹配 ab 或 c
|或的意思。|前后只要有满足条件的就可以作为结果返回。
()分组,将多个字符作为一个整体进行匹配。
\转义字符,用于匹配元字符本身。例如 \. 匹配 .

大家一定要练练,顺道可以使用函数感受不同函数,最后在不断的优化和整理判断

python">import re'''
使用match 函数测试 从字符串的起始位置匹配正则表达式,
match 函数用法:re.match(正则表达式, 要验证的字符串) 
如果匹配成功返回匹配对象,否则返回None。 match 会返回对象注意了后面根据is not None返回True或者False
'''
# .	匹配除换行符以外的任意单个字符。 a.b 匹配 aab、acb,但不匹配 a\nb
result = re.match(r'a.b', 'a\nb') is not None
print('元字符.的使用:%s' % result)
# ^	匹配字符串的开头。 ^abc 匹配 abcdef,但不匹配 defabc
result = re.match(r'^abc', 'abcdef') is not None
print('元字符^的使用:%s' % result)
# $	匹配字符串的结尾。 abc$ 匹配 defabc,但不匹配 abcdef
result = re.match(r'abc$', 'defabc') is not None
print('元字符$的使用:{}'.format(result))
# *	匹配前面的字符 0 次或多次。 ab* 匹配 a、ab、abb、abbb,aab等 不匹配cd ba
result = re.match(r'ab*', 'ba') is not None
print(f'元字符*的使用:{result}')
# +	匹配前面的字符 1 次或多次。 ab+ 匹配 ab、abb、abbb,但不匹配 a,ba
result = re.match(r'ab+', 'ba') is not None
print('元字符+的使用:',result)
# ?	匹配前面的字符 0 次或 1 次,通常用于表示某个字符或分组是可选的。ab? 匹配 a、ab、abbb 不匹配的话 ba
result = re.match(r'ab?', 'abbb') is not None
print('元字符?的使用:',result)
# {n}	匹配前面的字符恰好 n 次。a{3} 匹配 aaa,但不匹配 aa 或 aaaa。
# 这里注意了re.match() 函数用于从字符串的 起始位置 开始匹配正则表达式。如果匹配成功,返回一个匹配对象;如果匹配失败,返回 None
# match函数会返回对象的不能使用这个match来匹配了 否则aaaa会返回错误的
# 完全匹配整个字符串,而不是只匹配开头部分,可以使用 re.fullmatch():
# result = re.match(r'a{3}', 'aaaa') is not None
result = re.fullmatch(r'a{3}', 'aaaa') is not None
print('元字符{n}的使用:',result)
# {n,}	匹配前面的字符至少 n 次。a{2,} 匹配 aa、aaa、aaaa,但不匹配 a。
result = re.match(r'a{2,}', 'a') is not None
print('元字符{n,}的使用:',result)
# {n,m}	匹配前面的字符至少 n 次,至多 m 次。a{2,4} 匹配 aa、aaa、aaaa,但不匹配 a 或 aaaaa。 跟{n}情况一样 需要使用fullmatch
# 给大家留了一个备注大家可以打开使用看下aaaaa的结果
# result = re.match(r'a{2,4}', 'aaaaa') is not None
result = re.fullmatch(r'a{2,4}', 'aaaaa') is not None
print('元字符{n,m}的使用:',result)
# \d	匹配任意数字字符,等价于[0-9]。\d  匹配123、或者任意数字正确 匹配非数字错误123test
# 注意了 这里也是使用了fullmatch下面这种情况是正确的
# result = re.match(r'\d', '123test') is not None 使用findall() 返回字符串中所有匹配的子串,返回一个列表。
result = len(re.findall(r'\d', '123')) > 0
print('元字符\\d的使用:',result)
# \D	匹配任意非数字字符,等价于[^0-9]。\D+ 匹配 abc、@#$ 等。
result =len(re.findall(r'\D', '@#$')) > 0
print('元字符\\D的使用:',result)
# \w	匹配任意字母、数字或下划线字符,等价于[a-zA-Z0-9_]。 \w+ 匹配 abc123、user_name 等。不匹配$$$
result =len(re.findall(r'\w', '$$$')) > 0
print('元字符\\w的使用:',result)
# \W	匹配任意非字母、数字或下划线字符,等价于[^a-zA-Z0-9_]。 \W+ 匹配 $$$,不匹配abc123
result =len(re.findall(r'\W', 'abc123')) > 0
print('元字符\\W的使用:',result)
# \s	匹配任意空白字符(包括空格、制表符、换行符等)。 \s、\t(制表符)、\n(换行符)等。不匹配其他的abc、123
result =len(re.findall(r'\W', '\n')) > 0
print('元字符\\s的使用:',result)
# \S	匹配任意非空白字符。\S+ 匹配 abc、123 等。\S+ 匹配 abc、123  不匹配\s、\t(制表符)、\n(换行符)等
result =len(re.findall(r'\S', '\n')) > 0
print('元字符\\S的使用:{}'.format(result))
# []	匹配括号内的任意一个字符。例如[abc]匹配a、b或c。[abc] 匹配 a、b 或 c 不匹配 def
result =len(re.findall(r'[abc]', 'def')) > 0
print('元字符[]的使用:%s'% result)
# |	或的意思。|前后只要有满足条件的就可以作为结果返回。|a b匹配a或b`。
# 这儿注意了 这个| 会返回['', '', '', ''] 空列表所以需要再加上去空 过滤 list(filter(None, 列表))
# result =len(re.findall(r'|a|ab', 'def')) > 0
result = len(list(filter(None, re.findall(r'|a|ab', 'def')))) > 0
print(f'元字符|的使用:{result}')
# ()分组,将多个字符作为一个整体进行匹配。 (abc)+ 匹配 abc、abcabc 等。不匹配 abdec
result = len(list(filter(None, re.findall(r'(abc)', 'abdec')))) > 0
print(f'元字符()的使用:{result}')
# \	转义字符,用于匹配元字符本身。例如\.匹配.。 \. 匹配 .,\* 匹配 * 匹配:.abc  不匹配: #abc
result = len(list(filter(None, re.findall(r'\.', '#abc')))) > 0
print(f'元字符\\的使用:{result}')

re模块

写法

  示例方法为match其他一样:re.match(r'字符或者元字符',文本)

python">from re import match,search,findall,finditer,sub,split,compile,fullmatch,escape
# re.match()	re.match(正则表达式, 文本)	从字符串的起始位置匹配正则表达式,如果匹配成功返回匹配对象,否则返回None。
result = match(r'abc','abctest')
print(result)
# re.fullmatch()	re.fullmatch(正则表达式, 文本)	如果整个字符串与正则表达式完全匹配,则返回匹配对象,否则返回None。跟match看 尤其上面之前测试过了
result = fullmatch(r'abc','abctest')
print(result)
# re.search()	re.search(正则表达式, 文本)	扫描整个字符串,返回第一个匹配的对象,如果没有匹配则返回None。
result = search(r'e[a-z]*','hello')
print(result)
# re.findall()	re.findall(正则表达式, 文本)	返回字符串中所有匹配的子串,返回一个列表。
result = findall(r'abc','abcabc')
print(result)
# re.finditer()	re.finditer(正则表达式, 文本)	返回一个迭代器,包含所有匹配的对象。
result = finditer(r'a[a-z]c','abcabcabc')
print(result)
# re.sub()	re.sub(正则表达式, 替换字符串, 文本)	替换字符串中所有匹配正则表达式的部分,返回替换后的字符串。
result = sub(r'acc','abb','acc123456')
print(result)
# re.split()	re.split(正则表达式, 文本)	根据正则表达式分割字符串,返回一个列表。
result = split(r'acc','accabb')
print(result)
# re.compile()	re.compile(正则表达式)	将正则表达式编译成一个正则表达式对象,可以重复使用。
result = compile(r'acc')
print(result)
# re.escape()	re.escape(字符串)	对字符串中的特殊字符进行转义,使其可以安全地用作正则表达式。
result = escape('abc \n test')
print(result)

 常用函数和方法

方法名使用格式描述
re.match()re.match(正则表达式, 文本)从字符串的起始位置匹配正则表达式,如果匹配成功返回匹配对象,否则返回 None
re.search()re.search(正则表达式, 文本)扫描整个字符串,返回第一个匹配的对象,如果没有匹配则返回 None
re.findall()re.findall(正则表达式, 文本)返回字符串中所有匹配的子串,返回一个列表。
re.finditer()re.finditer(正则表达式, 文本)返回一个迭代器,包含所有匹配的对象。
re.sub()re.sub(正则表达式, 替换字符串, 文本)替换字符串中所有匹配正则表达式的部分,返回替换后的字符串。
re.split()re.split(正则表达式, 文本)根据正则表达式分割字符串,返回一个列表。
re.compile()re.compile(正则表达式)将正则表达式编译成一个正则表达式对象,可以重复使用。
re.fullmatch()re.fullmatch(正则表达式, 文本)如果整个字符串与正则表达式完全匹配,则返回匹配对象,否则返回 None
re.escape()re.escape(字符串)对字符串中的特殊字符进行转义,使其可以安全地用作正则表达式。

Python常用正则表达式

用户名验证:

        匹配用户名(字母开头,允许字母、数字、下划线和点)

python">import re# 正则表达式
pattern = r'^[a-zA-Z][a-zA-Z0-9_.]{3,15}$'
usernames = ["User123", "user_name", "123User", "us"]for username in usernames:if re.match(pattern, username):print(f"{username} 是有效的用户名")else:print(f"{username} 是无效的用户名")

密码验证

  1. 长度通常在 8 到 20 个字符之间。

  2. 必须包含至少一个大写字母、一个小写字母、一个数字和一个特殊字符(如 !@#$%^&*)。

  3. 不能包含空格。

python">import redef is_valid_password(password):# 密码正则表达式pattern = r'^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[!@#$%^&*])[A-Za-z\d!@#$%^&*]{8,20}$'return re.match(pattern, password) is not None

手机格式验证

python">import redef is_valid_phone_number(phone):pattern = r'^1[3-9]\d{9}$'  # 中国大陆手机号码格式return re.match(pattern, phone) is not Noneprint(is_valid_phone_number('13800138000'))  # 输出: True
print(is_valid_phone_number('12345678901'))  # 输出: False

邮箱验证

python">import redef is_valid_email(email):# 正则表达式pattern = r'^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$'return re.match(pattern, email) is not None

抓取地址

python">import redef extract_urls(text):pattern = r'https?://(?:[-\w.]|(?:%[\da-fA-F]{2}))+'return re.findall(pattern, text)text = "Visit https://www.example.com or http://example.org for more info."
print(extract_urls(text))  # 输出: ['https://www.example.com', 'http://example.org']

http://www.ppmy.cn/ops/165797.html

相关文章

【QT】-一文读懂抽象类

抽象类(Abstract Class)是面向对象编程中的一个概念,指的是无法被实例化的类,它通常作为其他类的基类。抽象类的作用是定义一个接口(或约定),让派生类(继承自抽象类的类)来实现具体的功能。 抽象类的特点: 包含纯虚函数(Pure Virtual Function): 抽象类通常包含一…

Linux 使用 docker 安装 Gogs 公司私有 Git 仓库

Gogs 简介 Gogs(Go Git Service)是一个用 Go 语言编写的自托管 Git 服务,类似于 GitHub 或 GitLab,但更轻量、易于部署和使用。Gogs 的目标是提供一个简单、快速且低资源占用的 Git 服务,适合个人开发者、小团队或企业…

LeetCode Hot100刷题——对称二叉树

101.对称二叉树 给你一个二叉树的根节点 root , 检查它是否轴对称。 示例 1: 输入:root [1,2,2,3,4,4,3] 输出:true示例 2: 输入:root [1,2,2,null,3,null,3] 输出:false提示: 树…

STM32全系大阅兵(2)

接前一篇文章:STM32全系大阅兵(1) 本文内容参考: STM32家族系列的区别_stm32各个系列区别-CSDN博客 STM32--STM32 微控制器详解-CSDN博客

《大语言模型》学习笔记(一)

一、什么是大语言模型 大语言模型是指在海量无标注文本数据上进行预训练得到的大型预训练语言模型,例如GPT-3,PaLM和LLaMA。大语言模型(Large Language Model,LLM)是一种基于深度学习的自然语言处理模型,能…

modbusrtu.h:5:10: error: ‘QSerialPort‘ file not found

解决 QSerialPort 头文件未找到的问题: 1. 确保已安装 Qt Serial Port 模块 QSerialPort 属于 Qt Serial Port 模块,需先确认已安装该模块。 安装步骤: 打开 Qt Maintenance Tool: 在开始菜单搜索并打开 Qt Maintenance Tool 选择当前安装的 Qt 版本,点击 “添加或移除…

Elasticsearch 7.x入门学习-系统架构与工作流程

1 核心概念 1.1 索引(Index) Elasticsearch 索引的精髓:一切设计都是为了提高搜索的性能。 一个索引就是一个拥有相似特征的文档集合。比如说,你可以有一个客户数据的索引,另一个产品目录的索引,还有一个…

第十五届蓝桥杯大学B组(握手问题、小球反弹、好数)

一、握手问题 思路1&#xff1a; 1)先让所有人相互握手 第一个人49次 第二个人48次 第五十个人0次 共计01249 2)减去7个没握手的 016 #include<stdio.h> int main() {int a 50*49/2 - 7*6/2;printf("%d\n",a);return 0; } 运行结果&#xf…