正则表达式(Regular Expression),简称Regex或RegExp,是一种用来匹配字符串的强大工具。Python内置的re模块可以让我们轻松使用正则表达式对字符串进行检索、替换、分割等操作,这为文本处理提供了很大的便利。
一、基础语法
正则表达式是由普通字符和一些特殊字符组成的,可以用来描述字符的特征、数量、出现次序等。下面是一些基础的正则表达式。
. 匹配任意字符,不包括换行符 \w 匹配字母、数字或下划线 \s 匹配任意空白字符,包括空格、制表符、换页符等 \d 匹配数字 ^ 匹配字符串的开始 $ 匹配字符串的结束 [] 匹配中括号中的任意一个字符 | 匹配 | 左右两侧的任意一个正则表达式 () 分组,可以对一部分正则表达式进行操作 * 匹配前面的表达式0次或多次 + 匹配前面的表达式1次或多次 ? 匹配前面的表达式0次或1次 {n} 匹配前面的表达式n次 {n,} 匹配前面的表达式至少n次 {n,m} 匹配前面的表达式n次到m次
例如,我们使用正则表达式 \d{3}-\d{5}
来匹配邮政编码,其中 \d 表示匹配数字,{3}表示匹配3次,-表示匹配横杆。这里的正则表达式的意思是先匹配3个数字,再匹配一个横杆,然后再匹配5个数字。
二、常用操作
re模块提供了很多常用的操作函数,这里介绍3个最常用的操作:search、match和sub。
1. search
search函数用来检索字符串中是否有符合正则表达式的内容,如果查找成功,返回一个Match对象,否则返回None。
import re # 查找邮箱地址 text = "我的邮箱是lichang@mail.com。" pattern = r'\w+@[a-zA-Z_]+?\.[a-zA-Z]{2,3}' result = re.search(pattern, text) if result: print(result.group()) # 输出lichang@mail.com else: print("未找到邮箱地址。")
2. match
match函数用来判断字符串开头是否符合正则表达式,如果符合,返回一个Match对象,否则返回None。
import re # 检查手机号码 text = "我的手机号码是18012345678。" pattern = r'^1\d{10}$' result = re.match(pattern, text) if result: print(result.group()) # 输出18012345678 else: print("未找到手机号码。")
3. sub
sub函数用来替换字符串中符合正则表达式的内容。
import re # 替换字符串 text = "I love Python!" pattern = r'\bPython\b' result = re.sub(pattern, "Java", text) print(result) # 输出I love Java!
三、高级应用
正则表达式还有很多高级应用,这里介绍3个最常见的:分组、零宽断言和贪婪与非贪婪匹配。
1. 分组
正则表达式使用 () 来进行分组,可以对分组内容进行重复或者替换。
import re # 替换文字 text = "2019年10月10日" pattern = r'(\d{4})年(\d{2})月(\d{2})日' result = re.sub(pattern, r'\1-\2-\3', text) print(result) # 输出2019-10-10
2. 零宽断言
零宽断言指的是匹配内容的前面或者后面应该满足一定的条件,但是这些条件不包括在匹配结果中。
import re # 查找http链接 text = "我的个人网站是http://www.lichang.net,欢迎来访问。" pattern = r'(?<=http://)[a-zA-Z0-9]+\.[a-zA-Z]+' result = re.search(pattern, text) if result: print(result.group()) # 输出www.lichang.net else: print("未找到链接。")
3. 贪婪与非贪婪匹配
正则表达式默认是贪婪模式,即尽可能多地匹配内容。非贪婪模式使用 ? 来标识,表示尽可能少地匹配内容。
import re # 正则表达式在匹配字符串时尽可能多地匹配内容 text = "Title