强烈推荐!Python 这个宝藏库 re 正则匹配

2022-07-05 14:36:28 浏览数 (1)

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

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

一. 预定义字符

d 匹配所有的十进制数字 0-9

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

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

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

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

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

二. 特殊字符
  1. $:匹配一行的结尾(必须放在正则表达式最后面)
  2. ^:匹配一行的开头(必须放在正则表达式最前面)
  3. *:前面的字符可以出现0次或多次(0~无限)(贪婪匹配)
  4. :前面的字符可以出现1次或多次(1~无限)(贪婪匹配)
  5. ?:变"贪婪模式"为"勉强模式",前面的字符可以出现0次或1次(非贪婪匹配)

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

  1. .:匹配除了换行符"n"之外的任意单个字符
  2. |:两项都进行匹配
  3. [ ]:代表一个集合,有如下三种情况

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

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

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

  1. { }:用于标记前面的字符出现的频率,有如下情况:

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

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

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

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

三. 反斜杠说明

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

四. 分组

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

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

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

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

五. 常用方法
  1. match:在目标文本的开头进行匹配
  2. search:在整个目标文本中进行匹配
  3. findall:扫描整个目标文本,返回所有与规则匹配的子串组成的列表,如果没有匹配的返回空列表
  4. split
代码语言:javascript复制
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 模块

代码语言:javascript复制
import re
示例1:具体使用说明

例如:

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

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

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

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

代码语言:javascript复制
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:网页信息匹配
代码语言:javascript复制
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:日期匹配
代码语言:javascript复制
date1=input("请输入年月日:")
result1=re.match(r'^(d{4}-d{1,2}-d{1,2})$',date1)
print(result1.group())
示例4:邮箱正则匹配
代码语言:javascript复制
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:手机号匹配
代码语言:javascript复制
phone=input("请输入手机号:")
result2=re.match(r'1[35678]d{9}',phone)
print(result2.group())

0 人点赞