编程学习网 > 编程语言 > Python > python re教程(Python re 正则匹配)
2023
06-26

python re教程(Python re 正则匹配)

Python 的 re 模块(Regular Expression 正则表达式)提供各种正则表达式的匹配操作。


在文本解析、复杂字符串分析和信息提取时是一个非常有用的工具,下面总结了 re 模块的常用方法。

一. 预定义字符
\d  匹配所有的十进制数字  0-9

\D  匹配所有的非数字,包含下划线

\s  匹配所有空白字符(空格、TAB等)

\S  匹配所有非空白字符,包含下划线

\w  匹配所有字母、汉字、数字    a-z A-Z 0-9

\W  匹配所有非字母、汉字、数字,包含下划线

二. 特殊字符
$:匹配一行的结尾(必须放在正则表达式最后面)

^:匹配一行的开头(必须放在正则表达式最前面)

*:前面的字符可以出现0次或多次(0~无限)(贪婪匹配)

+:前面的字符可以出现1次或多次(1~无限)(贪婪匹配)

?:变"贪婪模式"为"勉强模式",前面的字符可以出现0次或1次(非贪婪匹配)

备注:符号.* 贪婪,符号.*? 非贪婪

.:匹配除了换行符"\n"之外的任意单个字符

|:两项都进行匹配

[ ]:代表一个集合,有如下三种情况

[abc]:能匹配其中的单个字符

[a-z0-9]:能匹配指定范围的字符,可取反(在最前面加入^)

[2-9] [1-3]:能够做组合匹配

{ }:用于标记前面的字符出现的频率,有如下情况:
{n,m}:代表前面字符最少出现n次,最多出现m次

{n,}:代表前面字符最少出现n次,最多不受限制

{,m}:代表前面字符最多出现n次,最少不受限制

{n}:前面的字符必须出现n次

三. 反斜杠说明
字符串中有反斜杠的,需要对反斜杠做转义

四. 分组
():分组字符,可以为匹配到的内容分组,快速获取到分组中的数据 在正则里面 "()" 代表的是分组的意思,一个括号代表一个分组,你只能匹配到 "()" 中的内容。

group:用于查看指定分组匹配到的内容

groups:返回一个元组,组内为所有匹配到的内容

groupdict:返回一个字典,包含分组的键值对,需要为分组命名

五. 常用方法
match:在目标文本的开头进行匹配

search:在整个目标文本中进行匹配

findall:扫描整个目标文本,返回所有与规则匹配的子串组成的列表,如果没有匹配的返回空列表

split

re.split(pattern, string[, maxsplit=0, flags=0])
split(string[, maxsplit=0])
作用:可以将字符串匹配正则表达式的部分割开并返回一个列表

六. 正则表达式函数里面的flags参数说明
flags定义包括:

re.I:忽略大小写

re.L:表示特殊字符集 \w, \W, \b, \B, \s, \S 依赖于当前环境

re.M:多行模式

re.S:’.’并且包括换行符在内的任意字符(注意:’.’不包括换行符)

re.U:表示特殊字符集 \w, \W, \b, \B, \d, \D, \s, \S 依赖于 Unicode 字符属性数据库

在 Python 中使用正则表达式之前,先使用以下命令导入 re 模块

import re
示例1:具体使用说明
例如:

‘(\d)(a)\1’ 表示:匹配第一是数字,第二是字符a,第三 \1 必须匹配第一个一样的数字重复一次,也就是被引用一次。

如 “9a9” 被匹配,但 “9a8” 不会被匹配,因为第三位的 \1 必须是 9 才可以。

‘(\d)(a)\2’ 表示:匹配第一个是一个数字,第二个是a,第三个 \2 必须是第二组()中匹配一样的。

如 “8aa” 被匹配,但 “8ab”,“7a7” 不会被匹配,第三位必须是第二组字符的复制版,也是就引用第二组正则的匹配内容。

print(re.match(r'(\w{3}).',"abceeeabc456abc789").group())
print(re.match(r'(\w{3}).*',"abceeeabc456abc789").group())#*贪婪匹配
print(re.match(r'(\w{3}).*?',"abceeeabc456abc789").group())#?非贪婪匹配
print(re.search(r'(\d{3})',"abceeeabc456abc789").group())
print(re.search(r'(\w{3})(\d+)(\1)',"abceeeabc456abc789abc").groups())
print(re.search(r'(\w{3})(\d+)(\1)',"abceeeabc456abc789abc").group(1))
print(re.search(r'(\w{3})(\d+)(\1)',"abceeeabc456abc789abc").group(2))
print(re.search(r'(\w{3})(\d+)(\1)',"abceeeabc456abc789abc").group(3))
print(re.search(r'(\w{3})(\d+)(\2)',"abceeeabcs456456abc456789abc").groups())
print(re.search(r'(\w{3})(\d+)(\2)',"abceeeabcs456456abc456789abc").group(1))
print(re.search(r'(\w{3}).*?(\1)',"abceeeabc456abc789abc").group(1))
print(re.search(r'(\w{3}).*?(\1)',"abceeeabc456abc789abc").group(2))
print(re.search(r'(\w{3})(.*?)(\2)',"abceeeabc456abc789").group())
print(re.search(r'(\w{3}).*?(\1)',"abceeeabc456abc789").group(1,2))


print(re.findall(r'\d+','one11two22three33four44'))
print(re.split(r'\W+','192.168.1.1')) #\W匹配所有非字母、汉字、数字,包含下划线,然后处理完成返回一个列表
print(re.split(r'(\W+)','192.168.1.1')) #加了括号后做了分组的处理,.号也被分割了
print(re.split(r'(\W+)','192.168.1.1',1)) #加了一个1这个参数后,表示最大分割深度为1


str1 = '''goodjobisgood:
 testisgood
 welldone
 '''
res1 = re.findall(r'good(.*?)done',str1)

# 如果不使用re.S参数,则只在每一行内进行匹配,如果一行没有,就换下一行重新开始,不会跨行。

# 而使用re.S参数以后,正则表达式会将这个字符串作为一个整体,将“\n”当做一个普通的字符加入到这个字符串中,在整体中进行匹配。

res2 = re.findall(r'good(.*?)done',str1,re.S)
print(res1)
print(res2)
示例2:网页信息匹配
str1 = '<p>this is a herf<a href="www.baidu.com">goodjob</a></p>'
# find = re.search('<a href="(.+)">(\w+)</a>', str1)
find = re.search('<a href="(?P<url>.+)">(?P<name>\w+)</a>', str1)
print(find.groups())
print(find.group(1))
print(find.group(2))
print(find.groupdict())
示例3:日期匹配
date1=input("请输入年月日:")
result1=re.match(r'^(\d{4}-\d{1,2}-\d{1,2})$',date1)
print(result1.group())
示例4:邮箱正则匹配
re_email = r'^[a-zA-Z0-9_]{0,20}@(163|162|Gmail|yahoo)\.com'
email_address = input('请输入邮箱')
res = re.search(re_email, email_address)
print(res)
print(email_address)
print(type(res))
print(res.group())
示例5:手机号匹配
phone=input("请输入手机号:")
result2=re.match(r'1[35678]\d{9}',phone)

print(result2.group())

以上就是python re教程(Python re 正则匹配)的详细内容,想要了解更多Python教程欢迎持续关注编程学习网。

扫码二维码 获取免费视频学习资料

Python编程学习

查 看2022高级编程视频教程免费获取