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

2024-08-28 03:52

本文主要是介绍正则表达式模块re及其应用,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

正则表达式是一种强大的文本处理工具,能够用来匹配、查找、替换复杂的文本模式。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 repattern = r'\d+'  # 匹配数字
result = re.match(pattern, '123abc')
print(result.group())  # 输出:123
import repattern = r'\d+'  # 匹配数字
result = re.match(pattern, 'z123abc')
print(result.group())  
# AttributeError: 'NoneType' object has no attribute 'group'

🥝 re.search()

  • 在字符串中搜索第一个匹配的模式。
  • 返回的是一个匹配对象,若没有找到则返回None
import repattern = r'\d+'  # 匹配数字
result = re.search(pattern, 'abc123abc')
print(result.group())  # 输出:123
import repattern = r'\d+'  # 匹配数字
result = re.search(pattern, 'abc')
print(result.group())  
# AttributeError: 'NoneType' object has no attribute 'group'
import repattern = r'\d+'  # 匹配数字
result = re.search(pattern, 'abc1232a123')
print(result.group())  # 1232

🥝 re.findall()

  • 返回字符串中所有匹配的结果,结果以列表形式返回。
import repattern = r'\d+'  # 匹配数字
result = re.findall(pattern, 'abc123abc456')
print(result)  # 输出:['123', '456']

🥝 re.finditer()

  • 返回一个迭代器,迭代器生成的是匹配对象,可以用来遍历所有匹配。
import repattern = r'\d+'  # 匹配数字
result = re.finditer(pattern, 'abc123abc456')
for match in result:print(match.group())  
"""
输出:
123 
456
"""

🥝 re.sub()

  • 用于替换字符串中匹配的模式。
import repattern = r'\d+'  # 匹配数字
result = re.sub(pattern, 'X', 'abc123abc456')
print(result)  # 输出:abcXabcX

🥝 re.split()

  • 根据匹配的模式将字符串分割成列表。
import repattern = r'\d+'  # 匹配数字
result = re.split(pattern, 'abc123abc456')
print(result)  # 输出:['abc', 'abc', '']

🥝 re.compile()

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

    import repattern = 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 redef 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

这篇关于正则表达式模块re及其应用的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1113656

相关文章

一文深入详解Python的secrets模块

《一文深入详解Python的secrets模块》在构建涉及用户身份认证、权限管理、加密通信等系统时,开发者最不能忽视的一个问题就是“安全性”,Python在3.6版本中引入了专门面向安全用途的secr... 目录引言一、背景与动机:为什么需要 secrets 模块?二、secrets 模块的核心功能1. 基

Python使用Tkinter打造一个完整的桌面应用

《Python使用Tkinter打造一个完整的桌面应用》在Python生态中,Tkinter就像一把瑞士军刀,它没有花哨的特效,却能快速搭建出实用的图形界面,作为Python自带的标准库,无需安装即可... 目录一、界面搭建:像搭积木一样组合控件二、菜单系统:给应用装上“控制中枢”三、事件驱动:让界面“活”

如何确定哪些软件是Mac系统自带的? Mac系统内置应用查看技巧

《如何确定哪些软件是Mac系统自带的?Mac系统内置应用查看技巧》如何确定哪些软件是Mac系统自带的?mac系统中有很多自带的应用,想要看看哪些是系统自带,该怎么查看呢?下面我们就来看看Mac系统内... 在MAC电脑上,可以使用以下方法来确定哪些软件是系统自带的:1.应用程序文件夹打开应用程序文件夹

Python Flask 库及应用场景

《PythonFlask库及应用场景》Flask是Python生态中​轻量级且高度灵活的Web开发框架,基于WerkzeugWSGI工具库和Jinja2模板引擎构建,下面给大家介绍PythonFl... 目录一、Flask 库简介二、核心组件与架构三、常用函数与核心操作 ​1. 基础应用搭建​2. 路由与参

Spring Boot中的YML配置列表及应用小结

《SpringBoot中的YML配置列表及应用小结》在SpringBoot中使用YAML进行列表的配置不仅简洁明了,还能提高代码的可读性和可维护性,:本文主要介绍SpringBoot中的YML配... 目录YAML列表的基础语法在Spring Boot中的应用从YAML读取列表列表中的复杂对象其他注意事项总

电脑系统Hosts文件原理和应用分享

《电脑系统Hosts文件原理和应用分享》Hosts是一个没有扩展名的系统文件,当用户在浏览器中输入一个需要登录的网址时,系统会首先自动从Hosts文件中寻找对应的IP地址,一旦找到,系统会立即打开对应... Hosts是一个没有扩展名的系统文件,可以用记事本等工具打开,其作用就是将一些常用的网址域名与其对应

CSS 样式表的四种应用方式及css注释的应用小结

《CSS样式表的四种应用方式及css注释的应用小结》:本文主要介绍了CSS样式表的四种应用方式及css注释的应用小结,本文通过实例代码给大家介绍的非常详细,详细内容请阅读本文,希望能对你有所帮助... 一、外部 css(推荐方式)定义:将 CSS 代码保存为独立的 .css 文件,通过 <link> 标签

Python使用Reflex构建现代Web应用的完全指南

《Python使用Reflex构建现代Web应用的完全指南》这篇文章为大家深入介绍了Reflex框架的设计理念,技术特性,项目结构,核心API,实际开发流程以及与其他框架的对比和部署建议,感兴趣的小伙... 目录什么是 ReFlex?为什么选择 Reflex?安装与环境配置构建你的第一个应用核心概念解析组件

C#通过进程调用外部应用的实现示例

《C#通过进程调用外部应用的实现示例》本文主要介绍了C#通过进程调用外部应用的实现示例,以WINFORM应用程序为例,在C#应用程序中调用PYTHON程序,具有一定的参考价值,感兴趣的可以了解一下... 目录窗口程序类进程信息类 系统设置类 以WINFORM应用程序为例,在C#应用程序中调用python程序

正则表达式r前缀使用指南及如何避免常见错误

《正则表达式r前缀使用指南及如何避免常见错误》正则表达式是处理字符串的强大工具,但它常常伴随着转义字符的复杂性,本文将简洁地讲解r的作用、基本原理,以及如何在实际代码中避免常见错误,感兴趣的朋友一... 目录1. 字符串的双重翻译困境2. 为什么需要 r?3. 常见错误和正确用法4. Unicode 转换的