学习正则表达式在python中的应用

简介:

目的:对文本的处理,正则表达式的功能很强大,可以很巧妙的过滤、匹配、获取想要的字符串,是必须学习的技能,这里只记录常用的写法,详细文档可以参看官方帮助文档。


环境:ubuntu 16.04    python 3.5


在python中使用正则表达式首先要导入re模块

1
import  re

在re模块中有几个常用的函数:


re.compile('value')

它会返回一个正则表达式regex对象,作用是对预编译提速,且第二个参数支持一些方法,把它返回给一个变量方便重复使用,函数有两个参数:匹配表达式和第二个可选参数:

匹配表达式即,正则表达式的写法,因为表达式中常用\符号,所以一般第一个参数下载r''内,r表示引号内为自然字符,python不对内部做转义,这样正则表达式用转义时不用多加一个\,如:r'\d',\d在正则中是匹配一个数字,如果没有r则要写成'\\d',这样很麻烦且不易阅读。

最简单的匹配:r'haha'匹配字符'haha',但不匹配'hehe',可以使用通配符,下面介绍:

常用通配符:

\d表示一个数字

\w表示字母、数字、下划线中任意一个,且在python3中支持匹配一个汉字。

\s表示空格、制表符和换行中任意一个。

\D, \W, \S是他们的非模式。

^匹配字符串起始位置,当^在方括号内是表示非模式,[^a-z]小写26个字母以外。

$匹配字符串结尾位置。

\b表示一个字符旁空格的位置,'it is a good job', \bgoog\b匹配good,而不会匹配goods等其他。

| 竖杠表示或,如\d|\d{2},匹配一个数字或两个数字。

自定义通配符:

[a-z]表示小写a到z的26个字母中任意一个

[]中括号模式可以包含很多,比如:[a-zA-Z0-9_]这个就是\w(只在python2中相等),还可以想这样[aeiou]只包含想要匹配的,或者特殊符号[._-],需要转义的要加上\。


以上都是只匹配符合的一个,下面学习数量:

匹配最少:{5} 表示5次,{1,5}表示1次到5次都可以,{1,}省略后面的表示至少1次。

贪婪匹配:+等同于{1,},*表示可无或更多,?表示一次或更多,.点表示就是\S,这里都会匹配多的结果,因为是贪婪模式。

限制贪婪:在贪婪模式后面加上?表示限制贪婪,匹配最少,+会尽量匹配多的,+?匹配一个。


1
2
numRegex  =  re. compile (r '\d{11}' )
# 生成匹配11位数字的正则对象,\d是数字,{11}代表11次

re.compile()的第二个参数有:re.VERBOSE, re.IGNORECASE和re.DOTALL,后面要大写。

re.VERBOSE表示匹配中可以多行且有注释,在复杂的正则对象中使用。

1
2
3
4
re. compile (r '''(
     \d        #匹配一个数字
     \w        #匹配一个字符
)''' , re.VERBOSE)

re.IGORECASE表示匹配不区分大小写:

1
re. compile (r '[a-z]' , re.IGORECASE)

这个即可以匹配a,也可以匹配A。

re.DOTALL表示允许.匹配包括\s的内容

1
re. compile (r '.*' , re.DOTALL)

匹配所以内容。


匹配方法:search(), match(), findall(), finditer()

这些是匹配规则查找方法,也可以直接把正则表达式写在他们的第一个参数的位置(测试时可以,正式编写不推荐,理由在上面的compile中)而不用compile(),第二个参数是需要匹配的字符串,如

1
re.search(r '\d+' 'aa123abc' )

返回123


search()方法

search()方法进行全字符搜索,返回的是第一个符合条件的match对象,并且它只返回一个,即使后面有其他符合条件的,也不处理,没有则返回None。

1
2
aa  =  re. compile (r '\d\d\d+' )
bb  =  aa.search( 'aa12345abc678' )

bb得到返回的包含12345的match对象,而没有678


match()方法

match()方法从字符串开始处就匹配,且只返回一个符合条件的match对象,相当于正则表达式以r'^开始,匹配也只返回开始部分,没有则返回None。

1
2
aa  =  re. compile (r '\d+' )
bb  =  aa.search( '123ab45' )

bb得到返回的包含123的match对象,没有45,且如果字符串变成'a123ab45',则返回None。


findall()方法

findall()方法进行全字符搜索,返回所有符合条件的值,然后组成列表,即返回一个列表对象,没有则为空列表。

1
2
aa  =  re. compile (r '\d+' )
bb  =  aa.findall( 'a123b45c678' )

bb得到返回的的列表['123', '45', '678']


finditer()方法

finditer()方法进行全字符串搜索,返回所有符合条件的match对象,然后组成迭代器,用for方法可以看出迭代器里面是match对象。


这里match对象有group(), group(index)和groups()方法

可使用它们调用返回的match对象,group()和group(0)都是得到母值,groups()返回所有group(index)组成的元组。


分组和捕获

在正则表达式中使用圆括号()会产生分组,每个组都是元素,返回一个元组对象,可用group()获取对于序号的元素:

1
numRegex  =  re. compile (r '(\d)(\d)(\d)' )

当圆括号内左边使用?:表示不分组、不捕获,如:(?:\d)匹配但不分组也不捕获,不捕获则不生成match对象。


替换方法sub():

上面已经学习了查找,这个是替换方法,有两种常用方式,我称为全部隐藏替换和部分隐藏替换:

全部隐藏替换:

1
2
aa  =  re. compile (r 'engineer (\w)\w+' )
bb  =  aa.sub(r 'XX' 'engineer Ricky gave engineer Tom an apple' )

bb得到字符串'XX gave XX an apple'

部分隐藏替换:

1
2
aa  =  re. compile (r 'engineer (\w)\w+' )
cc  =  aa.sub(r '\1**' 'engineer Ricky gave engineer Tom an apple' )

cc得到字符串'R** gave T** an apple'


常用的正则表达式举例:

r'0\d{2,3}-\d{8}'      匹配固定电话,如:0755-87226688,010-85332765















本文转自RickyHuL51CTO博客,原文链接:http://blog.51cto.com/rickyh/1941536 ,如需转载请自行联系原作者
相关文章
|
15天前
|
开发者 Python
Python Socket编程:不只是基础,更有进阶秘籍,让你的网络应用飞起来!
在数字时代,网络应用成为连接世界的桥梁。Python凭借简洁的语法和丰富的库支持,成为开发高效网络应用的首选。本文通过实时聊天室案例,介绍Python Socket编程的基础与进阶技巧。基础篇涵盖服务器和客户端的建立与数据交换;进阶篇则探讨多线程与异步IO优化方案,助力提升应用性能。通过本案例,你将掌握Socket编程的核心技能,推动网络应用飞得更高、更远。
32 1
|
6天前
|
数据可视化 Python
Python绘制基频曲线——实例解析与应用探讨
Python绘制基频曲线——实例解析与应用探讨
30 9
|
17天前
|
数据采集 机器学习/深度学习 人工智能
Python编程入门:从零基础到实战应用
【9月更文挑战第15天】本文将引导读者从零开始学习Python编程,通过简单易懂的语言和实例,帮助初学者掌握Python的基本语法和常用库,最终实现一个简单的实战项目。文章结构清晰,分为基础知识、进阶技巧和实战应用三个部分,逐步深入,让读者在学习过程中不断积累经验,提高编程能力。
|
3天前
|
数据挖掘 Python
【Python】应用:pyproj地理计算库应用
这篇博客介绍了 `pyproj` 地理计算库的应用,涵盖地理坐标系统转换与地图投影。通过示例代码展示了如何进行经纬度与UTM坐标的互转,并利用 `pyproj.Geod` 计算两点间的距离及方位角,助力地理数据分析。 安装 `pyproj`:`pip install pyproj`。更多内容欢迎关注本博客,一起学习进步! Pancake 🍰 不迷路。😉*★,°*:.☆( ̄▽ ̄)/$:*.°★* 😏
|
4天前
|
存储 数据安全/隐私保护 Python
Python常用数据结构——字典的应用
Python常用数据结构——字典的应用
|
7天前
|
JavaScript 前端开发 UED
WebSocket在Python Web开发中的革新应用:解锁实时通信的新可能
在快速发展的Web应用领域中,实时通信已成为许多现代应用不可或缺的功能。传统的HTTP请求/响应模式在处理实时数据时显得力不从心,而WebSocket技术的出现,为Python Web开发带来了革命性的变化,它允许服务器与客户端之间建立持久的连接,从而实现了数据的即时传输与交换。本文将通过问题解答的形式,深入探讨WebSocket在Python Web开发中的革新应用及其实现方法。
20 3
|
6天前
|
数据库 开发者 Python
实战指南:用Python协程与异步函数优化高性能Web应用
在快速发展的Web开发领域,高性能与高效响应是衡量应用质量的重要标准。随着Python在Web开发中的广泛应用,如何利用Python的协程(Coroutine)与异步函数(Async Functions)特性来优化Web应用的性能,成为了许多开发者关注的焦点。本文将从实战角度出发,通过具体案例展示如何运用这些技术来提升Web应用的响应速度和吞吐量。
12 1
|
9天前
|
负载均衡 Java 调度
探索Python的并发编程:线程与进程的比较与应用
本文旨在深入探讨Python中的并发编程,重点比较线程与进程的异同、适用场景及实现方法。通过分析GIL对线程并发的影响,以及进程间通信的成本,我们将揭示何时选择线程或进程更为合理。同时,文章将提供实用的代码示例,帮助读者更好地理解并运用这些概念,以提升多任务处理的效率和性能。
|
7天前
|
机器学习/深度学习 物联网 算法框架/工具
探索Python的魅力与应用
在这篇文章中,我们将深入探讨Python编程语言的各个方面。从它的起源和设计理念开始,到具体的应用场景和技术实现,我们将一步步揭示Python成为现代编程领域中不可或缺的工具的原因。无论是对于初学者还是有经验的开发者来说,Python的魅力都不容小觑。
15 1
|
8天前
|
机器学习/深度学习 数据可视化 TensorFlow
探索Python在数据科学中的应用
这篇文章深入探讨了Python编程语言在数据科学领域的强大应用。从数据处理、分析到可视化,再到机器学习和深度学习,Python因其丰富的库和框架而成为数据科学家的首选工具。文章不仅介绍了Python的基本语法和数据结构,还详细讨论了如何使用Pandas进行数据清洗和预处理,以及NumPy和SciPy在数值计算中的重要性。此外,文章还涵盖了使用Matplotlib和Seaborn进行数据可视化的技巧,以及Scikit-learn和TensorFlow在构建预测模型中的应用。通过综合运用这些工具,数据科学家能够更有效地分析大量复杂的数据集,从而洞察趋势、模式和关联性,支持决策制定和策略优化。
14 2
下一篇
无影云桌面