正则表达式模块re及其应用

news2024/12/25 9:34:21

正则表达式是一种强大的文本处理工具,能够用来匹配、查找、替换复杂的文本模式。Python中的正则表达式由re模块提供。

以下是一些常用的方法及示例:

一. 常用方法

  1. re.match() 从头开始匹配
  2. re.search() 搜索第一个匹配串
  3. re.findall() 查找所有匹配项
  4. re.finditer() 遍历所有匹配
  5. re.sub() 替换字符串中匹配的模式
  6. re.split() 将字符串分割成列表
  7. re.compile() 编译正则表达式模式
import re

# re.match() 从头开始匹配 \d+ 匹配数字 pattern = r'\d+'
print(re.match(r'\d+', '123abc').group()) # 123

# re.search() 搜索第一个匹配的模式
print(re.search(r'\d+', '123abc1232').group()) # 123

# re.findall() 返回字符串中所有匹配的结果
print(re.findall(r'\d+', '123abc1232')) # ['123', '1232']

# re.finditer() 遍历所有匹配
for result in re.finditer(r'\d+', '123abc1232'):
    print(result.group())
"""
123
1232
"""

# re.sub() 替换字符串中匹配的模式 替换数字为X
print(re.sub(r'\d+', 'X', 'abc123abc456')) # abcXabcX

# re.split() 将字符串分割成列表 以数字为分隔符进行字符串分割
print(re.split(r'\d+', 'abc123abc456')) # ['abc', 'abc', '']

# re.compile() 编译正则表达式模式
print(re.compile(r'\d+').search('123 apples and 456 oranges').group()) # 123

🥝 re.match()

re.match(pattern, string, flags=0)
  • 尝试从字符串的起始位置匹配一个模式。
  • 如果匹配成功,则返回匹配的对象;否则返回None
import re

pattern = r'\d+'  # 匹配数字
result = re.match(pattern, '123abc')
print(result.group())  # 输出:123
import re

pattern = r'\d+'  # 匹配数字
result = re.match(pattern, 'z123abc')
print(result.group())  
# AttributeError: 'NoneType' object has no attribute 'group'

🥝 re.search()

  • 在字符串中搜索第一个匹配的模式。
  • 返回的是一个匹配对象,若没有找到则返回None
import re

pattern = r'\d+'  # 匹配数字
result = re.search(pattern, 'abc123abc')
print(result.group())  # 输出:123
import re

pattern = r'\d+'  # 匹配数字
result = re.search(pattern, 'abc')
print(result.group())  
# AttributeError: 'NoneType' object has no attribute 'group'
import re

pattern = r'\d+'  # 匹配数字
result = re.search(pattern, 'abc1232a123')
print(result.group())  # 1232

🥝 re.findall()

  • 返回字符串中所有匹配的结果,结果以列表形式返回。
import re

pattern = r'\d+'  # 匹配数字
result = re.findall(pattern, 'abc123abc456')
print(result)  # 输出:['123', '456']

🥝 re.finditer()

  • 返回一个迭代器,迭代器生成的是匹配对象,可以用来遍历所有匹配。
import re

pattern = r'\d+'  # 匹配数字
result = re.finditer(pattern, 'abc123abc456')
for match in result:
    print(match.group())  
"""
输出:
123 
456
"""

🥝 re.sub()

  • 用于替换字符串中匹配的模式。
import re

pattern = r'\d+'  # 匹配数字
result = re.sub(pattern, 'X', 'abc123abc456')
print(result)  # 输出:abcXabcX

🥝 re.split()

  • 根据匹配的模式将字符串分割成列表。
import re

pattern = r'\d+'  # 匹配数字
result = re.split(pattern, 'abc123abc456')
print(result)  # 输出:['abc', 'abc', '']

🥝 re.compile()

  • 编译正则表达式模式,返回一个模式对象,可以使用这个模式对象进行更高效的匹配操作。

    import re
    
    pattern = r'\d+'  # 匹配数字
    result = re.compile(pattern).search('123 abc 456 abc')
    print(result.group())  # 123
    

二. 正则表达式模式

优先级:转义字符>括号>量词>字符类>断言>连接>管道符号

🥝 常用的模式 pattern

在这里插入图片描述在这里插入图片描述在这里插入图片描述

patterndescription
[]匹配方括号包围字符集合的任意一个字符
[^x]匹配除了x以外的任意字符
[\u4e00-\u9fa5]匹配中文汉字,汉字在 Unicode 的区间为此
[a-z]匹配小写字母 a-z
[A-Z]匹配大写字母 A-Z
[0-9]匹配数字 0-9
[a-zA-Z0-9]匹配字母和数字 a-z A-Z 0-9
[a-zA-Z0-9_]匹配字母,数字和下划线 a-z A-Z 0-9 _
[A-Za-z0-9_]匹配字母或数字或下划线 a-z A-Z 0-9 _
[^A-Za-z0-9_]匹配任意非字母,数字,下划线的字符
[ \f\n\r\t\v]匹配任意的空白符 空格
[^ \f\n\r\t\v]匹配任意非空白符的字符
[0-9]匹配数字
[^0-9]匹配任意非数字的字符
^匹配字符串的开始 行开头,例如:^\d+数字开头
$匹配字符串的结束 行末,例如:\d+$数字结尾
|或运算符,匹配左侧或右侧的表达式
.匹配除换行符以外的任意字符
\.匹配点,例如小数点
\.?匹配点,可以匹配0个或1个小数点

🥝 修饰符 flags

codedescription
Iignore - 不区分大小写
Mmulti line - 多行匹配
S特殊字符圆点 . 中包含换行符 \n
ASCII匹配 ASCII 字符
X忽略空格和注释

三. 应用实例

1. 检验字符/字符串

检验邮箱是否有效

# 检验邮箱是否有效
import re
#pattern = r"^[a-zA-Z0-9]+@[a-zA-Z0-9]+\.[a-zA-Z]{2,}$"
pattern = r"^\w+@\w+\.[a-zA-Z]{2,}$"
# [a-zA-Z]{2,} 匹配前面的字符至少2次 {2,}, ∵邮箱的后缀最少有2个字,例如.cn
def val_email(email):
    if re.match(pattern, email):
        print("合法的邮件地址")
    else:
        print("无效的邮件地址")
val_email("test@163.cn")  # 合法的邮件地址
val_email("testhotmail.com")     # 无效的邮件地址

常用字符串有效/无效检验正则表达式:

  • 邮箱正则表达式 ^\w+@\w+\.[a-zA-Z]{2,}
  • 手机号 ^(?:\+86)?1[3-9]\d{9}$
  • 网址 ^(https?://)?(www\.)?[a-zA-Z0-9-]+\.[a-zA-Z]{2,}(/[a-zA-Z0-9#]+)*$
  • 微信号^[a-zA-Z][-_a-zA-Z0-9]{5,19}$
  • QQ号 ^[1-9][0-9]{4,10}$
  • 十六进制颜色 ^#?([a-fA-F0-9]{6}|[a-fA-F0-9]{3})$

更多字符/字符串校验👇

import re
# 校验字符和字符串
# 1.校验邮箱
email_pattern = r'^[a-zA-Z0-9]+@[a-zA-Z0-9]+\.[a-zA-Z]{2,}$'
emails = ["test@example.com", "invalid-email.com"]
for email in emails:
    if re.match(email_pattern, email):
        print(f"Valid email: {email}")
    else:
        print(f"Invalid email: {email}")

# 2.校验手机号
phone_pattern = r'^(?:\+86)?1[3-9]\d{9}$'
phones = ["13812345678", "1234567890", "+8613812345678"]
for phone in phones:
    if re.match(phone_pattern, phone):
        print(f"Valid phone number: {phone}")
    else:
        print(f"Invalid phone number: {phone}")

# 3.校验网址
url_pattern = r'^(https?://)?(www\.)?[a-zA-Z0-9-]+\.[a-zA-Z]{2,}(/[a-zA-Z0-9#]+)*$'
urls = ["https://www.example.com", "http://example.com", "www.example.com", "invalid-url"]
for url in urls:
    if re.match(url_pattern, url):
        print(f"Valid URL: {url}")
    else:
        print(f"Invalid URL: {url}")

# 4.校验身份证
id_card_pattern = r'^\d{17}[\dX]$'
id_cards = ["12345678901234567X", "123456789012345678"]
for id_card in id_cards:
    if re.match(id_card_pattern, id_card):
        print(f"Valid ID card: {id_card}")
    else:
        print(f"Invalid ID card: {id_card}")
# 5.校验邮政编码(中国)
postal_code_pattern = r'^\d{6}$'
postal_codes = ["100000", "12345", "abcdef"]
for postal_code in postal_codes:
    if re.match(postal_code_pattern, postal_code):
        print(f"Valid postal code: {postal_code}")
    else:
        print(f"Invalid postal code: {postal_code}")

# 6.校验日期格式(YYYY-MM-DD)
date_pattern = r'^\d{4}-\d{2}-\d{2}$'
dates = ["2023-10-17", "2023-2-28", "20231017"]
for date in dates:
    if re.match(date_pattern, date):
        print(f"Valid date: {date}")
    else:
        print(f"Invalid date: {date}")

# 7.校验强密码(至少8个字符,包含字母、数字和特殊字符)
password_pattern = r'^(?=.*[A-Za-z])(?=.*\d)(?=.*[@$!%*?&])[A-Za-z\d@$!%*?&]{8,}$'
passwords = ["A1b@cdef", "12345678", "password"]
for password in passwords:
    if re.match(password_pattern, password):
        print(f"Valid password: {password}")
    else:
        print(f"Invalid password: {password}")

# 8.校验车牌号
plate_pattern = r'^[京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领A-Z]{1}[A-Z]{1}[A-Z0-9]{4}[A-Z0-9挂学警港澳]{1}$$'
passwords = ["京K39006", "12345678", "password"]
for password in passwords:
    if re.match(plate_pattern, password):
        print(f"Valid password: {password}")
    else:
        print(f"Invalid password: {password}")

2. 匹配字符/字符串

import re
string = '<div style="display:none;">\n \
<script src="#" language="JavaScript"></script>\n\
<div class="info">\n\
<p>20test13.59sMy phone is 123-456-7890 and email is example@example.com.</p>\n\
</div>\n</div>'

# 匹配字符串中的特定词 \b 边界匹配, 确保整个词而不是词的一部分被匹配
print(re.findall(r'\b' + re.escape("div") + r'\b', string, re.M))  # ['div', 'div', 'div', 'div']

# 忽略大小写 re.I ignore
print(re.search(r'\b\w*j\w*\b', string, flags=re.I|re.M).group()) # JavaScript

# 多行 re.M
print(re.findall(r'^<.*>$', string, re.M))
# ['<div style="display:none;">', '<div class="info">', '<p>test</p>', '</div>', '</div>']

# 或运算符 |
print(re.findall(r'style|class', string, re.M)) # ['style', 'class']

# 匹配数字(可含小数点)
print(re.findall(r'\d+\.?\d+', string, re.M))  # ['20', '13.59', '123', '456', '7890']

# 匹配电话号码
print(re.findall(r'\d{3}-\d{3}-\d{4}', string, re.M))  # ['123-456-7890']

# 匹配电子邮件地址
print(re.findall(r'[\w.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+', string, re.M))  # ['example@example.com']

3. 删除与替换

演示如何删除空行、查找并替换每行的"world"为"世界",以及删除特定的第3到第5行。

import re

def process_text(text):
    # 1. 删除空行
    # 使用正则表达式匹配空行并替换为 ""
    text = re.sub(r'\n\s*\n', '\n', text)  # 删除连续空行
    text = re.sub(r'^\s*\n', '', text, flags=re.MULTILINE)  # 删除开头的空行

    # 2. 查找并替换每行中的 "world" 为 "世界"
    text = re.sub(r'world', '世界', text)

    # 3. 删除第3行到第5行
    lines = text.splitlines()
    # 选择第1行和第2行,以及第6行及之后的行
    lines = lines[:2] + lines[5:]

    # 将处理后的行合并为字符串
    return '\n'.join(lines)

# 示例文本
text = """Hello world!

This is a test.

world is beautiful.

Remember to explore the world.

Goodbye.
"""

# 处理文本
processed_text = process_text(text)

# 输出结果
print(processed_text)

"""
Hello 世界!

This is a test.

Goodbye.

"""

参考:

  • https://docs.python.org/zh-cn/3.12/howto/regex.html
  • https://www.runoob.com/regexp/regexp-tutorial.html
  • https://www.runoob.com/python3/python3-reg-expressions.html
  • https://www.iamwawa.cn/regexp.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2079960.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

代码随想录Day 27|贪心算法,题目:455.分发饼干、376.摆动序列、53.最大子序和

提示&#xff1a;DDU&#xff0c;供自己复习使用。欢迎大家前来讨论~ 文章目录 贪心算法Part01一、理论基础1.1 什么是贪心贪心算法解法&#xff1a;动态规划解法&#xff1a; 1.2 贪心一般解题步骤 二、题目题目一&#xff1a;455.分发饼干解题思路&#xff1a;其他思路 题目…

【Datawhale AI夏令营第五期】 CV方向 Task02学习笔记 精读Baseline 建模方案解读与进阶

【Datawhale AI夏令营第五期】 CV方向 Task02学习笔记 精读Baseline 建模方案解读与进阶 教程&#xff1a; 链接&#xff1a; https://linklearner.com/activity/16/16/68 传送门 之前我看原画课的时候&#xff0c;造型的部分就跟我们说&#xff0c;让我们日常观察事物的时候…

海运系统:海运拼箱 小批量货物的海运奥秘

在国际海运运输的广阔领域中&#xff0c;海运拼箱作为一种灵活且经济的运输方式&#xff0c;尤其适用于那些货物量不大或体积不足以单独填满一个标准集装箱的场景。这种运输模式不仅促进了国际贸易的便捷性&#xff0c;还通过资源共享的方式&#xff0c;有效降低了物流成本&…

p10 容器的基本命令

首先先拉取一个centos的镜像 命令&#xff1a;docker pull centos 新建容器并且启动 这里直接参考老师的命令吧 接下来是启动并且进入到容器当中去输入docker run -it centos /bin/bash这里是以交互的方式进入到容器中可以看到接下来的ls命令输出的东西就是一个Linux系统最…

Ansys Speos | 挡风玻璃光学畸变分析

附件下载 联系工作人员获取附件 此示例介绍了基于 TL 957 标准和43号法规&#xff08;ECE R43&#xff09;的挡风玻璃光学畸变分析的工作流程&#xff0c;以及 GitHub Ansys 光学自动化中提供的分析自动化工具。 如果您从未使用过任何 GitHub 仓库&#xff0c;可以根据光学自…

数据结构(邓俊辉)学习笔记】串 07——KMP算法:分摊分析

文章目录 1.失之粗糙2.精准估计 1.失之粗糙 以下&#xff0c;就来对 KMP 算法的性能做一分析。我们知道 KMP 算法的计算过程可以根据对齐位置相应的分为若干个阶段&#xff0c;然而每一个阶段所对应的计算量是有很大区别的。很快就会看到&#xff0c;如果只是简单地从最坏的角…

K8S的持久化存储

文章目录 一、持久化存储emptyDir实际操作 hostPath建立过程 NFS存储NFS 存储的优点NFS 存储的缺点具体操作 pv和pvcPersistent Volume (PV)使用场景 Persistent Volume Claim (PVC)使用场景 使用 PV 和 PVC 的场景实际操作 StorageClassStorageClass 概述应用场景实际应用 一、…

实用攻略:亲身试用,高效数据恢复软件推荐!

今天要跟大家分享一下我使用几款数据恢复软件的经历。如果你曾经丢失过重要的文件&#xff0c;那除了注意备份外&#xff0c;也可以尝试一下这些非常棒的免费数据恢复软件&#xff01; 第一款&#xff1a;福昕数据恢复 链接&#xff1a;www.pdf365.cn/foxit-restore/ 首先聊…

Nginx+ModSecurity(3.0.x)安装教程及配置WAF规则文件

本文主要介绍ModSecurity v3.0.x在Nginx环境下的安装、WAF规则文件配置、以及防御效果的验证&#xff0c;因此对于Nginx仅进行简单化安装。 服务器操作系统&#xff1a;linux 位最小化安装 一、安装相关依赖工具 Bash yum install -y git wget epel-release yum install -y g…

大模型企业应用落地系列二》基于大模型的对话式推荐系统》核心技术架构设计图

注&#xff1a;此文章内容均节选自充电了么创始人&#xff0c;CEO兼CTO陈敬雷老师的新书《自然语言处理原理与实战》&#xff08;人工智能科学与技术丛书&#xff09;【陈敬雷编著】【清华大学出版社】 文章目录 大模型企业应用落地系列二基于大模型的对话式推荐系统》心技术架…

【精品】计算机毕业设计之:springboot游戏分享网站(源码+文档+辅导)

博主介绍&#xff1a; ✌我是阿龙&#xff0c;一名专注于Java技术领域的程序员&#xff0c;全网拥有10W粉丝。作为CSDN特邀作者、博客专家、新星计划导师&#xff0c;我在计算机毕业设计开发方面积累了丰富的经验。同时&#xff0c;我也是掘金、华为云、阿里云、InfoQ等平台…

win11,vscode上用docker环境跑项目

1.首先用dockerfile创建docker镜像 以下是dockerfile文件的内容&#xff1a; FROM pytorch/pytorch:1.11.0-cuda11.3-cudnn8-devel LABEL Service"SparseInstanceActivation"ENV TZEurope/Moscow ENV DETECTRON_TAGv0.6 ARG DEBIAN_FRONTENDnoninteractiveRUN apt-…

JavaScript:js;知识回顾;笔记分享

一&#xff0c;js前奏 1&#xff0c;js简介&#xff1a; Javascript是一种由Netscape(网景)的LiveScript发展而来的原型化继承的面向对象的动态类型的区分大小写的客户端脚本语言&#xff0c;主要目的是为了解决服务器端语言&#xff0c;比如Perl&#xff0c;遗留的速度问题&a…

数据结构与算法(1)

抽象数据类型定义 算法的效率 时间效率 一个算法的运行时间是指一个算法在计算机上运行所耗费的时间 大致可以等于计算机执行一种简单的操作(如赋值、比较、移动等) 所需的时间与算法中进行的简单操作次数乘积。 比较时间复杂度&#xff08;看数量级&#xff09; 空…

【STM32】RTC

忠实的时间记录者——RTC&#xff0c;板子断电也能继续记录&#xff08;当然&#xff0c;得有纽扣电池供电&#xff09;。 大部分图片来源&#xff1a;正点原子HAL库课程 专栏目录&#xff1a;记录自己的嵌入式学习之路-CSDN博客 目录 1 概述 2 应用 3 RTC方案 4 …

javacv-ffmpeg ProcessBuilder批量旋转图片

javacv-ffmpeg ProcessBuilder实现对图片的旋转&#xff0c;最近需要处理很多图片&#xff0c;量有点多&#xff0c;所以不能一个一个去编辑旋转图片&#xff0c;所以写一个工具类&#xff0c;实现对图片的旋转 maven配置文件&#xff0c;加上对ffmpeg的依赖&#xff0c;由于f…

关于自定义控件,头文件找不到问题的解决办法

在ui文件中使用控件提升的时候&#xff0c;突然发现ui_xxxx.h竟然报错了&#xff0c; 这在之前是没有碰到过&#xff0c;苦思过后认为是环境变量的问题&#xff0c;因为现在正在用的构建套件是 mingw 的&#xff0c;但在此之前我一直用的是msvc&#xff0c;并且环境变量的配置…

骑行耳机该怎么选?精选南卡、骨聆、小米多款顶尖实用品牌!

骨传导耳机&#xff0c;作为运动骑行领域的黑科技伴侣&#xff0c;以其独特的传音方式&#xff0c;让众多骑行运动爱好者在享受音乐的同时&#xff0c;依然能清晰感知外界环境&#xff0c;提升运动安全与乐趣。然而&#xff0c;随着骨传导耳机热度增加&#xff0c;市面上开始出…

Prometheus监控Kubernetes ETCD

文章目录 一、kubeadm方式部署etcd1.修改etcd指标接口监听地址2.prometheus中添加etcd的服务发现配置3.创建etcd的service4.grafana添加etcd监控模版 二、二进制方式部署k8s etcd1.将etcd服务代理到k8s集群2.创建etcd证书的secrets3.prometheus挂载etcd证书的secrets4.promethe…

63. 不同路径 II -dp7

63. 不同路径 IIhttps://leetcode.cn/problems/unique-paths-ii/ 输入&#xff1a;obstacleGrid [[0,0,0],[0,1,0],[0,0,0]] 输出&#xff1a;2 解释&#xff1a;3x3 网格的正中间有一个障碍物。 从左上角到右下角一共有 2 条不同的路径&#xff1a; 1. 向右 -> 向右 ->…