Python学习第十三天

正则表达式

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

概念

官网概念:正则表达式(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] 匹配 abc
| 或的意思。|前后只要有满足条件的就可以作为结果返回。
() 分组,将多个字符作为一个整体进行匹配。
\ 转义字符,用于匹配元字符本身。例如 \. 匹配 .

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

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 re

def 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 re

def is_valid_phone_number(phone):
    pattern = r'^1[3-9]\d{9}$'  # 中国大陆手机号码格式
    return re.match(pattern, phone) is not None

print(is_valid_phone_number('13800138000'))  # 输出: True
print(is_valid_phone_number('12345678901'))  # 输出: False

邮箱验证

python 复制代码
import re

def 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 re

def 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']
相关推荐
天天进步20151 分钟前
Python项目--基于Python的自然语言处理文本摘要系统
开发语言·python·自然语言处理
小麦果汁吨吨吨13 分钟前
Flask快速入门
后端·python·flask
流云一号17 分钟前
Python实现贪吃蛇三
开发语言·前端·python
小白教程20 分钟前
如何处理Python爬取视频时的反爬机制?
开发语言·python·音视频·python爬虫
Always_away36 分钟前
数据库系统概论|第三章:关系数据库标准语言SQL—课程笔记4
数据库·笔记·sql·学习
热爱编程的OP43 分钟前
Numpy常用库方法总结
开发语言·python·numpy
cliffordl1 小时前
ReportLab 导出 PDF(文档创建)
开发语言·python·pdf
纪元A梦1 小时前
华为OD机试真题——跳格子3(2025A卷:200分)Java/python/JavaScript/C++/C语言/GO六种最佳实现
java·javascript·c++·python·华为od·go·华为od机试题
在下_诸葛1 小时前
狂神SQL学习笔记六:列的数据类型讲解
笔记·sql·学习
水w1 小时前
【Python爬虫】简单案例介绍2
开发语言·爬虫·python