摘要
书接前文:
01-
02-
03-
04-
05-
06-
本文将分析模式匹配和正则表达式。不管是Python、Java、C#等主流编程语言,还是SQL数据处理,都离不开正则表达式,进行快速字符串匹配或者截取。如果通过字符串匹配的方式去截取数据,将是一个非常麻烦的事情。如果通过正则表达式去匹配则非常容易快捷高效。
主要内容:
一 正则表达式案例
1-案例:手机号码校验
手机号码规则
2-案例-电话号码查找
二 正则表达式语法
0-字符分类
1-正则表达式分组
2-正则表达式管道
3-正则表达式可选匹配
4-正则表达式匹配零次或者多次
5-正则表达式匹配一次或者多次
6-正则表达式匹配指定次数n-m次
7-建立自己的字符分类
8-插入字符^开始和美元符号$结束
9-通配字符 .
10-点-星 匹配字符串
三 正则表达式 match()与search()
1-re.match()
2-re.search()
3-findall()
4-忽略大小写
四 总结

一 正则表达式案例
1-案例:手机号码校验
正则表达式:
import re
#创建正则表达式对象
regexObj = re.compile(r'^(?:+?86)?1(?:3d{3}|5[^4D]d{2}|8d{3}|7(?:[0-35-9]d{2}|4(?:0d|1[0-2]|9d))|9[0-35-9]d{2}|6[2567]d{2}|4(?:(?:10|4[01])d{3}|[68]d{4}|[579]d{2}))d{6}$')
phone = regexObj.match('15989114102')
if phone:
print(phone.group()+'是有效手机号码')
else:
print('匹配失败,不是有效手机号码')
phone = re.match(pattern='^(?:+?86)?1(?:3(?:4[^9D]|[5-9]d)|5[^3-6D]d|7[28]d|8[23478]d|9[578]d)d{7}$',string='15989114102')
print(phone.group()+'是中国移动')
例如:
import re
#创建正则表达式对象
regexObj = re.compile(r'^(?:+?86)?1(?:3d{3}|5[^4D]d{2}|8d{3}|7(?:[0-35-9]d{2}|4(?:0d|1[0-2]|9d))|9[0-35-9]d{2}|6[2567]d{2}|4(?:(?:10|4[01])d{3}|[68]d{4}|[579]d{2}))d{6}$')
phone = regexObj.match('15989114102')
if phone:
print(phone.group()+'是有效手机号码')
else:
print('匹配失败,不是有效手机号码')
phone = re.match(pattern='^(?:+?86)?1(?:3(?:4[^9D]|[5-9]d)|5[^3-6D]d|7[28]d|8[23478]d|9[578]d)d{7}$',string='15989114102')
print(phone.group()+'是中国移动')
参考电话号码规则:


2-案例-电话号码查找
import re
regexObj = re.compile(r'ddd-ddd-dddd')#校验规则,d表示一位数字
phone = regexObj.search(r'他的电话号码是 400-400-4000')
if phone:
print(phone.group())
#运行结果
400-400-4000
二 正则表达式语法
字符分类
d 0-9的任意数字
D 除了0-9以外的任何字符
w 任何
W 除了任何

1-正则表达式分组
import re
regexObj = re.compile(r'(ddd)-(ddd-dddd)')#校验规则,d表示一位数字,()表示分组
phone = regexObj.search(r'他的电话号码是 400-400-4000')
if phone:
print(phone.group(1))
print(phone.group(2))
print(phone.group(0))
print(phone.group())
#运行结果:
400
400-4000
400-400-4000
400-400-4000
2-正则表达式管道
#管道 |
import re
regexObj = re.compile(r'(dd(1|2))-(ddd-dddd)')#校验规则,d表示一位数字,()表示分组,|表示管道
phone = regexObj.search(r'他的电话号码是 400-400-4000 或者401-400-4000 或者 402-400-4000')
if phone:
print(phone.group(1))
print(phone.group(2))
print(phone.group(0))
print(phone.group())
#运行结果
#管道 |...
401
1
401-400-4000
401-400-4000
3-正则表达式可选匹配
#?可选 Bat(wo)?man > Batman 或者Batwoman
import re
regexObj = re.compile(r'(dd(1|2))?ddd-dddd')#?表示可选
phone = regexObj.search(r'他的电话号码是 400-400-4000 或者401-401-4001')
if phone:
print(phone.group(1))
print(phone.group(2))
print(phone.group(0))
print(phone.group())
else:
print('没有匹配上')
#运行结果
None
None
400-4000
400-4000
4-正则表达式匹配零次或者多次
#()*匹配0次或者多次
import re
regexObj = re.compile(r'(d)*(1|2)-(d)*-(d)*')#?表示可选
phone = regexObj.search(r'他的电话号码是 4010-400-4000 或者41101-401-4001')
if phone:
print(phone.group(1))
print(phone.group(2))
print(phone.group(0))
print(phone.group())
else:
print('没有匹配上')
5-正则表达式匹配一次或者多次
#()+匹配1次或者多次
import re
regexObj = re.compile(r'(4)+(d)*(1|2)-(d)*-(d)*')#?表示可选
phone = regexObj.search(r'他的电话号码是 4010-400-4000 或者31101-401-4001 或者41101-401-4001')
if phone:
print(phone.group(1))
print(phone.group(2))
print(phone.group(0))
print(phone.group())
else:
print('没有匹配上')
6-正则表达式匹配指定次数n-m次
#(){n,m}匹配指定n-m次
import re
regexObj = re.compile(r'(4)+(d){3}(1|2)-(d){3}-(d){1,5}')#?表示可选
phone = regexObj.search(r'他的电话号码是 4010-400-4000 或者31101-401-4001 或者41101-401-40015或者41101-401-40014')
if phone:
print(phone.group(1))
print(phone.group(2))
print(phone.group(0))
print(phone.group())
else:
print('没有匹配上')
7-建立自己的字符分类
import re
regexObj = re.compile(r'([^4D])+')#不是以4开头的数字
phone = regexObj.search(r'他的电话号码567841是 4010-400-4000 或者31101-401-4001 或者41101-401-40015或者41101-401-40014')
if phone:
print(phone.group())
else:
print('没有匹配上')
[]表示自己选用的字符分类,[^..]表示非
8-插入字符^开始和美元符号$结束
import re
regexObj = re.compile(r'^hello')#以hello 开头 ^
phone = regexObj.search(r'x hello world,他的电话号码567841是 4010-400-4000 或者31101-401-4001 或者41101-401-40015或者41101-401-40014')
if phone:
else:
print('没有匹配上')
#####
phone = regexObj.search(r'hello world,他的电话号码567841是 4010-400-4000 或者31101-401-4001 或者41101-401-40015或者41101-401-40014')
if phone:
print(phone.group())
#####
import re
regexObj = re.compile(r'd$')#最后一位数字
regexObj = re.compile(r'd+$')#最后一组数字
phone = regexObj.search(r'hello world,他的电话号码567841是 5, 4010-400-4000 或者31101-401-4001 或者41101-401-40015或者41101-401-40014 8888')
if phone:
print(phone.group())
else:
print('没有匹配上')
#####
import re
regexObj = re.compile(r'^d+$')#以数字开始并结束
phone = regexObj.search(r'1225104')
if phone:
print(phone.group())
else:
print('没有匹配上')
9-通配字符 .
通配表示一位用 .表示
import re
regexObj = re.compile(r'^d+.$')#以数字开始并最后一位任意字符结束
phone = regexObj.search(r'1225104x')
if phone:
print(phone.group())
else:
print('没有匹配上')
10-点-星 匹配字符串
匹配所有字符串
import re
regexObj = re.compile(r'电话号码是:(.*)或者(.*)')# 匹配所有字符
phone = regexObj.search(r'电话号码是:123441或者14621')
if phone:
print(phone.group(1))
print(phone.group(2))
else:
print('没有匹配上')
三 正则表达式 match()与search()

1-re.match()
re.match()的概念是从头匹配一个符合规则的字符串,从起始位置开始匹配,匹配成功返回一个对象,未匹配成功返回None。包含的参数如下:
pattern: 正则模型
string : 要匹配的字符串
falgs : 匹配模式
match() 方法一旦匹配成功,就是一个match object对象,而match object对象有以下方法:
2-re.search()
re.search()#函数会在字符串内查找模式匹配,只要找到第一个匹配然后返回,如果字符串没有匹配,则返回None。
group() 返回被 RE 匹配的字符串
start() 返回匹配开始的位置
end() 返回匹配结束的位置
span()返回一个元组包含匹配 (开始,结束) 的位置
3-findall()
等同于group(),但是返回的是字符串列表
4-忽略大小写
re.IGNORECASE
四 总结
掌握正则表达式匹配模式的写法,能够可以顺利按照自己的规则匹配数据并且截取数据。熟悉匹配的通配符号和规则。
