当前位置: 首页 > article >正文

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

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

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'字符或者元字符',文本)

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常用正则表达式

用户名验证:

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

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. 不能包含空格。

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

手机格式验证

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

邮箱验证

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

抓取地址

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']

http://www.kler.cn/a/585052.html

相关文章:

  • 第三百七十五节 JavaFX教程 - JavaFX表视图
  • 【氮化镓】开态GaN HEMTs中氧诱导Vth漂移的缺陷演化
  • 【Go学习】04-4-Gorm框架-增删改查事务钩子
  • Redis 源码分析-内部数据结构 ziplist
  • React hook钩子性能优化Hooks的面试常考题目
  • SQL29 计算用户的平均次日留存率
  • 前端面试:React hooks 调用是可以写在 if 语句里面吗?
  • 2025-03-13 学习记录--C/C++-PTA 练习2-9 整数四则运算
  • 十五、Vue 与 Webpack 5:优化构建性能的实用技巧
  • 【Android】Android 悬浮窗开发 ( 动态权限请求 | 前台服务和通知 | 悬浮窗创建 )
  • Maple网络浮动版安装|添加新版本授权到已有授权服务器
  • VMware虚拟机网络连接模式介绍以及nat模式访问公网实践
  • css实现标题跑马灯效果
  • 区块链实战:手把手教你搭建私有链网络
  • 【HarmonyOS Next】鸿蒙应用常规面试题和答辩思路参考
  • kotlin中的行为组件
  • Win11+WSL2安装cuda11.8,Anaconda配置Pytorch2.4-GPU版本
  • 2025移动端软件供应链安全开源治理方案最佳实践
  • ‌HTTP 401错误
  • 【附JS、Python、C++题解】Leetcode面试150题(9)——三数之和