轻松玩转Python正则表达式

news2024/12/25 0:20:25

在这里插入图片描述

引言

正则表达式是一种强大的文本匹配和处理工具,广泛应用于各种编程语言中。在Python中,我们可以使用内置的re模块来处理正则表达式。本文将带您从入门到精通,逐步介绍Python中的正则表达式用法,并提供实例演示。

1. 正则表达式基础

1.1 什么是正则表达式

正则表达式是一种用于描述和匹配字符串模式的表达式。它由一系列字符和特殊字符组成,用于在文本中进行搜索和替换操作。

1.2 基本匹配规则

正则表达式中的基本匹配规则包括普通字符的匹配、点号的匹配任意字符、转义字符的使用等。

import re

pattern = r"abc"  # 匹配字符串 "abc"
string = "xyz abc def"

result = re.findall(pattern, string)
print(result)  # Output: ['abc']

1.3 字符类和预定义字符类

字符类用于匹配指定范围内的字符,预定义字符类则表示常见的字符组合,如数字、字母、空白字符等。

import re

pattern = r"[0-9]"  # 匹配任意数字字符
string = "abc 123 def"

result = re.findall(pattern, string)
print(result)  # Output: ['1', '2', '3']

1.4 量词和贪婪匹配

量词用于指定匹配的次数,如匹配0次或多次、匹配1次或多次等。贪婪匹配是指尽可能多地匹配字符,非贪婪匹配则尽可能少地匹配字符。

import re

pattern = r"a+"  # 匹配一个或多个连续的字符 "a"
string = "aaaabbb"

result = re.findall(pattern, string)
print(result)  # Output: ['aaaa']

1.5 边界匹配

边界匹配用于限定匹配的位置,如行的开头、行的结尾、单词的边界等。

import re

pattern = r"\bhello\b"  # 匹配整个单词 "hello"
string = "hello world"

result = re.findall(pattern, string)
print(result)  # Output: ['hello']

2. 使用re模块

2.1 re模块的导入

在使用Python进行正则表达式操作之前,我们需要先导入re模块。

import re

2.2 re.match()方法

re.match()方法用于从字符串的开头开始匹配模式,如果匹配成功,则返回一个匹配对象;否则返回None。

import re

pattern = r"hello"
string = "hello world"

result = re.match(pattern, string)

if result:
    print("Match found!")
else:
    print("No match")

2.3 re.search()方法

re.search()方法用于在字符串中搜索匹配模式,如果找到任意位置的匹配,则返回一个匹配对象;否则返回None。

import re

pattern = r"world"
string = "hello world"

result = re.search(pattern, string)

if result:
    print("Match found!")
else:
    print("No match")

2.4 re.findall()方法

re.findall()方法用于在字符串中搜索所有匹配模式的子串,并将它们作为列表返回。

import re

pattern = r"\d+"
string = "I have 10 apples and 20 oranges."

result = re.findall(pattern, string)

print(result)  # Output: ['10', '20']

2.5 re.sub()方法

re.sub()方法用于在字符串中搜索匹配模式的子串,并将其替换为指定的字符串。

import re

pattern = r"apple"
string = "I have an apple."

result = re.sub(pattern, "banana", string)

print(result)  # Output: "I have an banana."

3. 正则表达式的高级用法

3.1 分组和捕获

正则表达式中的分组和捕获允许我们将匹配的子串提取出来,并在后续操作中使用。

import re

pattern = r"(\d+)-(\d+)-(\d+)"  # 匹配日期格式 "YYYY-MM-DD"
string = "Today is 2023-06-28."

result = re.search(pattern, string)

if result:
    year = result.group(1)
    month = result.group(2)
    day = result.group(3)
    print(f"Year: {year}, Month: {month}, Day: {day}")
else:
    print("No match")

3.2 非贪婪匹配

非贪婪匹配是指尽可能少地匹配字符,可以通过在量词后加上"?"来实现。

import re

pattern = r"a+?"
string = "aaaaa"

result = re.findall(pattern, string)
print(result)  # Output: ['a', 'a', 'a', 'a', 'a']

3.3 向前界定和向后界定

向前界定和向后界定用于限定匹配的前后条件,但不包括在匹配结果中。

import re

pattern = r"(?<=@)\w+"  # 匹配邮箱地址中的用户名
string = "john@example.com"

result = re.findall(pattern, string)
print(result)  # Output: ['example']

3.4 反向引用

反向引用用于在正则表达式中引用前面已经匹配的子串。

import re

pattern = r"(\w+)\s+\1"  # 匹配重复的单词
string = "hello hello world world"

result = re.findall(pattern, string)
print(result)  # Output: ['hello', 'world']

3.5 零宽断言

零宽断言用于匹配某个位置前或后的子串,但不包括在匹配结果中。

import re

pattern = r"\d+(?= dollars)"  # 匹配 "dollars" 前面的数字
string = "I have 100 dollars."

result = re.findall(pattern, string)
print(result)  # Output: ['100']

4. 实例演示

4.1 邮箱验证

使用正则表达式验证输入的字符串是否为有效的邮箱地址。

import re

pattern = r"^\w+@\w+\.\w+$"  # 匹配邮箱地址
email = "test@example.com"

result = re.match(pattern, email)
if result:
    print("Valid email address")
else:
    print("Invalid email address")

4.2 URL提取

从文本中提取所有的URL链接。

import re

pattern = r"http[s]?://(?:[a-zA-Z]|[0-9]|[$-_@.&+]|[!*\\(\\),]|(?:%[0-9a-fA-F][0-9a-fA-F]))+"
text = "Visit my website at https://example.com. You can also check out https://example.org."

result = re.findall(pattern, text)
print(result)  # Output: ['https://example.com', 'https://example.org']

4.3 HTML标签提取

从HTML文档中提取所有的标签内容。

import re

pattern = r"<([^>]+)>"  # 匹配HTML标签
html = "<h1>Hello</h1><p>World</p>"

result = re.findall(pattern, html)
print(result)  # Output: ['h1', '/h1', 'p', '/p']

4.4 敏感词过滤

使用正则表达式过滤文本中的敏感词。

import re

sensitive_words = ["bad", "evil", "dangerous"]
text = "This is a bad example."

for word in sensitive_words:
    pattern = fr"\b{re.escape(word)}\b"  # 匹配敏感词并确保单词边界
    text = re.sub(pattern, "***", text)

print(text)  # Output: "This is a *** example."

结论

本文介绍了Python中正则表达式的基础知识和高级用法,包括基本匹配规则、使用re模块进行正则操作的方法以及一些常见的实例演示。掌握正则表达式的技巧和应用,将能够更高效地处理和处理文本数据。希望本文能够对您在Python中使用正则表达式有所帮助。

更多Python的学习资料可以扫描下方二维码无偿领取!!!

1)Python所有方向的学习路线(新版)

总结的Python爬虫和数据分析等各个方向应该学习的技术栈。

在这里插入图片描述

比如说爬虫这一块,很多人以为学了xpath和PyQuery等几个解析库之后就精通的python爬虫,其实路还有很长,比如说移动端爬虫和JS逆向等等。

img

(2)Python学习视频

包含了Python入门、爬虫、数据分析和web开发的学习视频,总共100多个,虽然达不到大佬的程度,但是精通python是没有问题的,学完这些之后,你可以按照我上面的学习路线去网上找其他的知识资源进行进阶。

在这里插入图片描述

(3)100多个练手项目

我们在看视频学习的时候,不能光动眼动脑不动手,比较科学的学习方法是在理解之后运用它们,这时候练手项目就很适合了,只是里面的项目比较多,水平也是参差不齐,大家可以挑自己能做的项目去练练。

在这里插入图片描述

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

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

相关文章

电商兴起与电脑城衰退:利弊分析与展望

随着科技的飞速发展和互联网的普及&#xff0c;电子产品成为现代生活中不可或缺的一部分。在过去很长一段时间里&#xff0c;想要购买电子设备都逃不开一个叫“电脑城”的地方&#xff0c;那里鱼龙混杂良莠不齐&#xff0c;是令许多人记忆深刻分外难忘之处。然而&#xff0c;随…

U启动盘(NETBASE第十二课)

1.域环境组策略的应用规则 1&#xff09;策略的继承 继承&#xff1a;默认下级容器继承上级容器的组策略配置Default Domain Policy禁止更改桌面背景运行-dsa.msc创建OU并命名为caiwu&#xff0c;在caiwu的OU中创建新用户xmxm用户在win10客户端主机登录&#xff0c;验证不能更…

MongoDB比Mysql快的原因,为什么 MongoDB 索引选择B-树,而 Mysql 索引选择B+树

一、B树和B树的区别 很明显&#xff0c;我们想向弄清楚原因就要知道B树和B树的区别。为了不长篇大论。我们直接给出他们的形式总结他们的特点。 1、B树 B树是一种自平衡的搜索树&#xff0c;形式很简单&#xff1a; 这就是一颗B-树。针对我们这个问题的最核心的特点如下&#…

软件测试面试题(带答案)

1. 请自我介绍一下(需简单清楚的表述自已的基本情况&#xff0c;在这过程中要展现出自信&#xff0c;对工作有激情&#xff0c;上进&#xff0c;好学) 面试官您好&#xff0c;我叫###&#xff0c;今年26岁&#xff0c;来自广东深圳&#xff0c;就读专业是电子商务&#xff0c;…

TypeScript算法题实战——剑指 Offer篇(4)

目录 一、礼物的最大价值1.1、题目描述1.2、题解 二、最长不含重复字符的子字符串2.1、题目描述2.2、题解 三、丑数3.1、题目描述3.2、题解 四、第一个只出现一次的字符4.1、题目描述4.2、题解 五、数组中的逆序对5.1、题目描述5.2、题解 六、两个链表的第一个公共节点6.1、题目…

任务型对话对话策略学习的强化学习方法

任务型对话(TOD)系统旨在帮助用户解决从天气咨询到计划安排的一系列问题。完成任务的途径有二。 其一是端到端途径&#xff1a;直接将当前对话内容与系统的自然语言反映相关联。此种方法多是采用序列到序列的模型&#xff0c;然后进行监督训练。 第二种是模组途径&#xff1a…

can 相关背题

1 CAN FD 和CAN的 区别&#xff1a; CAN-FD&#xff1a;一帧数据最长64字节。以理解成CAN协议的升级版&#xff0c;只升级了协议&#xff0c;物理层未改变。传输速率不同、数据长度不同、帧格式不同、ID长度不同。 1&#xff09;速率不同&#xff1a; CAN&#xff1a;最大传…

机械臂的雅克比矩阵推导

1. 线速度和角速度的递推通式推导 p i p i − 1 R i − 1 r i − 1 , i i − 1 \mathbf{p}_{i}\mathbf{p}_{i-1}\mathbf{R}_{i-1} \mathbf{r}_{i-1, i}^{i-1} pi​pi−1​Ri−1​ri−1,ii−1​ p i − 1 \mathbf{p}_{i-1} pi−1​是 { i − 1 } \{i-1\} {i−1}坐标系的原点的…

获取全国各地行政区的genjson数据以及使用leaflet加载行政区数据

前言 在写代码之前&#xff0c;我们需要做一些准备工作&#xff0c;需要有一份某个行政区的geojson数据&#xff0c;如果你没有也没关系&#xff0c;我们可以去下载&#xff0c;地址&#xff1a;geojson数据下载网站 打开网站&#xff0c;选择自己想要获取的行政区&#xff0…

FPGA学习——按键控制LED流水灯(附源码 无按键消抖版本)

文章目录 一、前言二、开发板按键原理图三、源码四、实现效果 一、前言 在博主的cyclone4开发板上一共有4个按键&#xff0c;本次实验的目的是为了实现每按下一次按键&#xff0c;都会使开发板上的4个LED灯切换一次状态&#xff0c;博主一共设计了四种状态&#xff0c;分别是&…

滴水逆向三期笔记与作业——02C语言——04 IF语句逆向分析下

OneNote防丢失。 海哥牛逼。 目录 一、if…else...反汇编1、反汇编特点2、案例分析 二、作业1三、IF...ELSE IF...ELSE IF..多分支语句1、多分支反汇编2、案例分析 四、作业2 一、if…else…反汇编 1、反汇编特点 2、案例分析 二、作业1 解&#xff1a; 分析图&#xff1a; 分…

【基于矢量射线的衍射积分 (VRBDI)】基于矢量射线的衍射积分 (VRBDI) 和仿真工具(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

前端开发中常见的20个数组方法,你掌握了几个?

文章目录 前言一、常见的数组方法1.1 push (将指定的元素添加到数组的末尾&#xff0c;并返回新的数组长度)1.2 pop (从数组中删除最后一个元素&#xff0c;并返回该元素的值)1.3 shift (从数组中删除第一个元素&#xff0c;并返回该元素的值)1.4 unshift (向数组首位添加一个或…

路径规划算法:基于鹈鹕优化的路径规划算法- 附代码

路径规划算法&#xff1a;基于鹈鹕优化的路径规划算法- 附代码 文章目录 路径规划算法&#xff1a;基于鹈鹕优化的路径规划算法- 附代码1.算法原理1.1 环境设定1.2 约束条件1.3 适应度函数 2.算法结果3.MATLAB代码4.参考文献 摘要&#xff1a;本文主要介绍利用智能优化算法鹈鹕…

VirtualBox单机版安装K8S+TF

本文参考自&#xff1a;kubernetes最新版安装单机版v1.21.5_kubernetes下载_qq759035366的博客-CSDN博客 只用一台VB虚拟机&#xff0c;装K8S加Tungsten Fabric。 0. 提前避坑&#xff1a; 0.1 Tungsten Fabric的VRouter对Linux内核版本有要求&#xff0c;以下内核版本才…

音视频——码率、帧率越高越清晰?分辨率、像素、dpi的关系

一 前言 本期我介绍一下视频的一些基础概念&#xff0c;如帧率、码率、分辨率、像素、dpi、视频帧、I帧、P帧、gop等。我i初步学习音视频&#xff0c;给这些专业词汇进行扫盲 会解释多少码率是清晰的&#xff0c;是否帧率越高越流畅等问题。 这些概念是比较杂乱的&#xff0c…

微信二维码登录,修改下面提示的字体和样式

背景 由于业务需要&#xff0c;需要把微信二维码下面默认的提示文字进行修改&#xff0c;如下图所示&#xff1a; 需要修改上面红色框内选择的字体&#xff0c;在研究的过程中&#xff0c;发现好多人都在查询这个问题&#xff0c;并且有些网友思路也是对的。可能只是方式没对。…

库存扣减设计和下单

这里写目录标题 前言正文库存设计原则常见库存扣减方案秒杀订单域设计整体服务领域模型领域服务领域事件之下单下单整体流程同步下单库存预扣减库存扣减 总结参考链接 前言 大家好&#xff0c;我是练习两年半的Java练习生&#xff0c;前面我们已经介绍了领域驱动和缓存设计&am…

路径规划算法:基于金豺优化的路径规划算法- 附代码

路径规划算法&#xff1a;基于金豺优化的路径规划算法- 附代码 文章目录 路径规划算法&#xff1a;基于金豺优化的路径规划算法- 附代码1.算法原理1.1 环境设定1.2 约束条件1.3 适应度函数 2.算法结果3.MATLAB代码4.参考文献 摘要&#xff1a;本文主要介绍利用智能优化算法金豺…