重磅文章!小明哥带你解锁Python正则的正确使用姿势~

简介: 大家好,我是志斌~前几天有位读者问我能不能出一篇关于讲解正则的文章,所以今天志斌专门去请了一位正则非常牛的大佬—小明哥来跟大家分享一下他的正则经验,文末更附有小明哥撰写的系统文档《Python正则表达式速查表与实操案例》,快来学习吧~

对于正则表达式,其实就四类应用正则匹配、正则查找、正则替换和正则切割。

正则匹配比较常规,掌握基本语法即可。本文将带你玩转正则查找、正则替换和正则切割的高端使用姿势。

在使用正则表达式之前,我们首先需要导入正则模块:

import re


正则的三板大斧


正则查找


示例1:查找所有连续的数字


s = '  taobao 123 google 456'
re.findall("\d+", s)


结果:

['123', '456']


示例2:查找所有连续的中文内容


s = "<tr><td>4980</td><td>上行低速率</td><td>110</td><td>上行低速率</td></tr>"
re.findall("[\u4E00-\u9FA5]+", s)


结果:

['上行低速率', '上行低速率']


示例3:找出英文文章中所有4个字母的单词:

s = "Clothes are so significant in our daily life that we can't live without them"
re.findall(r"\b[a-z]{4}\b", s, re.I)


结果:

['life', 'that', 'live', 'them']


正则替换


示例1:删除文本行后面的注释


phone = "2004-959-559 # 这是一个电话号码"
re.sub(r'#.*$', "", phone)


结果:

2004-959-559


示例2:删除电话号码所有非数字的内容

phone = "2004-959-559 # 这是一个电话号码"
re.sub(r'\D', "", phone)


结果:

2004959559


示例3:给金额字符串添加万分符

s = """5305256725元
4220元
870元
7866369414527元
144995元
2069993310元
354070715448元
711元
2113046206元"""
re.sub(r"(?<=\d)(?=(?:\d{4})+元)", ",", s)


结果:

53,0525,6725元
4220元
870元
7,8663,6941,4527元
14,4995元
20,6999,3310元
3540,7071,5448元
711元
21,1304,6206元


示例4:将重叠的字符替换成单个字符(zzzz->z)

"我我...我我...我要..要要...要要...学学学....学学...编编编...编程..程.程程...程...程"

转成:

"我要学编程"

s = "我我...我我...我要..要要...要要...学学学....学学...编编编...编程..程.程程...程...程"
re.sub(r"(.)\1+", r"\1", s.replace(".", ""))


结果:

'我要学编程'


示例5:连续单词去重

例如:

the little cat cat is in the hat hat hat2, we like it.

其中 cat 和 hat 连接出现多次,要求处理后结果是:

the little cat is in the hat hat2, we like it.

s = "the little cat cat is in the hat hat hat2, we like it."
re.sub(r"(\b\w+)(?:\s+\1\b)+", r"\1", s)


结果:

'the little cat is in the hat hat2, we like it.'


示例6:ip地址排序

s = "192.68.1.254 102.49.23.013 10.10.10.10 2.2.2.2 8.109.90.30"
s = re.sub(r"(\d+)", r"00\1", s)
s = re.sub(r"0*(\d{3})", r"\1", s)
s = " ".join(sorted(s.split()))
s = re.sub(r"0*(\d+)", r"\1", s)


结果:

'2.2.2.2 8.109.90.30 10.10.10.10 102.49.23.13 192.68.1.254'


示例7:将字符串中的所有连续数字翻倍

s = 'A23G4HFD567'
re.sub('\d+', lambda m: str(int(m.group(0))*2), s)


结果:

'A46G8HFD1134


示例8:将字符串中的所有大于6的数字替换成9, 小于6的数字替换为0

s = 'AB837D5D4F7G8H7F8H56D4D7G4D3'
re.sub('\d+', lambda m: '9'if int(m.group()) >= 6else'0', s)


结果:

'AB9D0D0F9G9H9F9H9D0D9G0D0'


示例9:给每个逗号分割的片段增加递增的数值编号

from itertools import count
s = "张三,李四,王五,赵六,孙七,周八"
numbers = count(1)
re.sub("[^,,]+", lambda m: f"{next(numbers)}.{m.group()}", s)
结果:
'1.张三,2.李四,3.王五,4.赵六,5.孙七,6.周八'


正则切割


示例1:需要切割出下面这个字符串的每个连续的字符串(含有不确定数量的空格和tab)

s = "FRN2004001  100  VCP772Z            417  BX             417  BX  181128307   CN10  1220  2000           5,004  EA    2020.03.30  45408263  L12 L12"
re.split("\s+", s)

结果:

['FRN2004001',
 '100',
 'VCP772Z',
 '417',
 'BX',
 '417',
 'BX',
 '181128307',
 'CN10',
 '1220',
 '2000',
 '5,004',
 'EA',
 '2020.03.30',
 '45408263',
 'L12',
 'L12']

示例2:需要取出其中所有的北京xx,即北京西、北京站、北京北、北京南站 和 北京东。

s = "北京西北京站北京北北京南站北京东"
re.split("(?!^)(?=北京)", s)

结果:

['北京西', '北京站', '北京北', '北京南站', '北京东']


Python正则表达式速查表与实操案例


上面的的案例是不是看起来很高端,但却看不懂为什么这么写?

没有关系,江湖人称为明佬的【小小明】,给大家写了系统文档《Python正则表达式速查表与实操案例》

这个文档非常全面,不仅仅是学习正则的好文档,还是一份语法速查表,适用从小白到专家级别的正则玩家。

目录如下:


62.png


image-20210712204730109

第一部分就是正则语法的速查表,方便新手熟手快速查询正则语法。

第二部分详解了贪婪模式与非贪婪模式

第三部分专门将分组的规则

第四部分详解位置类的语法

第五部分详解了正则的各种模式

第六部分则是本文各类案例的详解

后面,则是一些的原理讲解,对写出好的正则有一定的帮助。

总之,在我看完这份文档后,个人觉得实在是牛逼,比其他公众号导出传的正则文档强了十倍百倍。然而这么高端的正则文档却很少人看到,所以我分享给大家,让大家也步入高阶数据处理的大门吧。

跟着小明哥学数据处理绝对有戏成为秒杀一大片公众号和专栏作者的高手。

也欢迎大家关注小明哥CSDN,学习更多干货知识,点击阅读原文即可转入。

如何获取文档呢?

相关文章
|
3月前
|
Python
揭秘Python编程核心:一篇文章带你深入掌握for循环与while循环的奥秘!
【8月更文挑战第21天】Python中的循环结构——for循环与while循环,是编程的基础。for循环擅长遍历序列或集合中的元素,如列表或字符串;而while循环则在未知循环次数时特别有用,基于某个条件持续执行。本文通过实例展示两种循环的应用场景,比如用for循环计算数字平方和用while循环计算阶乘。此外,还通过案例分析比较了两者在处理用户输入任务时的不同优势,强调了根据实际需求选择合适循环的重要性。
49 0
|
1月前
|
编解码 UED Python
Python批量修改指定目录下图片的大小名文章
Python批量修改指定目录下图片的大小名文章
15 1
|
2月前
|
存储 Go C语言
Python 的整数是怎么实现的?这篇文章告诉你答案
Python 的整数是怎么实现的?这篇文章告诉你答案
55 7
|
2月前
|
JSON API 数据库
从零到英雄?一篇文章带你搞定Python Web开发中的RESTful API实现!
在Python的Web开发领域中,RESTful API是核心技能之一。本教程将从零开始,通过实战案例教你如何使用Flask框架搭建RESTful API。首先确保已安装Python和Flask,接着通过创建一个简单的用户管理系统,逐步实现用户信息的增删改查(CRUD)操作。我们将定义路由并处理HTTP请求,最终构建出功能完整的Web服务。无论是初学者还是有经验的开发者,都能从中受益,迈出成为Web开发高手的重要一步。
57 4
|
30天前
|
存储 自然语言处理 数据库
Python字典操作实现文章敏感词检索
Python字典操作实现文章敏感词检索
|
1月前
|
存储 Java 开发者
用一篇文章告诉你如何篡改 Python 虚拟机
用一篇文章告诉你如何篡改 Python 虚拟机
11 0
|
3月前
|
Python
Python函数式编程:你真的懂了吗?理解核心概念,实践高阶技巧,这篇文章带你一次搞定!
【8月更文挑战第6天】本文介绍了Python中的函数式编程,探讨了高阶函数、纯函数、匿名函数、不可变数据结构及递归等核心概念。通过具体示例展示了如何利用`map()`和`filter()`等内置函数处理数据,解释了纯函数的一致性和可预测性特点,并演示了使用`lambda`创建简短函数的方法。此外,文章还强调了使用不可变数据结构的重要性,并通过递归函数实例说明了递归的基本原理。掌握这些技巧有助于编写更清晰、模块化的代码。
33 3
|
4月前
|
数据采集 网络协议 数据挖掘
网络爬虫进阶之路:深入理解HTTP协议,用Python urllib解锁新技能
【7月更文挑战第30天】网络爬虫是数据分析和信息聚合的关键工具。深入理解HTTP协议及掌握Python的urllib库对于高效爬虫开发至关重要。HTTP协议采用请求/响应模型,具有无状态性、支持多种请求方法和内容协商等特点。
48 3
|
4月前
|
机器学习/深度学习 数据挖掘 TensorFlow
🔍揭秘Python数据分析奥秘,TensorFlow助力解锁数据背后的亿万商机
【7月更文挑战第29天】在数据丰富的时代,Python以其简洁和强大的库支持成为数据分析首选。Pandas库简化了数据处理与分析,如读取CSV文件、执行统计分析及可视化销售趋势。TensorFlow则通过深度学习技术挖掘复杂数据模式,提升预测准确性。两者结合助力商业决策,把握市场先机,释放数据巨大价值。
48 4