正则表达式的介绍
1)在实际开发过程中经常会有查找符合某些复杂规则的字符串的需要,比如:邮箱、手机号码等,这时候想匹配或者查找符合某些规则的字符串就可以使用正则表达式了。
2)正则表达式就是记录文本规则的代码
re模块
在Python中需要通过正则表达式对字符串进行匹配的时候,可以使用一个 re 模块
# 导入re模块
import re
# 使用match方法进行匹配操作
result = re.match(正则表达式,要匹配的字符串)
# 如果上一步匹配到数据的话,可以使用group方法来提取数据
result.group()
# 导入re模块
import re
# 使用match方法进行匹配操作
result = re.match("test","test.cn")
# 获取匹配结果
info = result.group()
print(info)
结果:
test
re.match() 根据正则表达式从头开始匹配字符串数据如果第一个匹配不成功就会报错
匹配单个字符
1.匹配任意一个字符
# 匹配任意一个字符
import re
ret = re.match(".","x")
print(ret.group())
ret = re.match("t.o","too")
print(ret.group())
ret = re.match("o.e","one")
print(ret.group())
运行结果:
x
too
one
# 注 防止转移 真实的. 可以加\
re.match("[\[\]]",']')
2.匹配[ ]中列举的字符
import re
ret = re.match("[hH]","hello Python")
print(ret.group())
ret = re.match("[hH]","Hello Python")
print(ret.group())
运行结果:
h
H
re.match['[A-Za-z','a']
# 取反符号(仅限中括号)^ 另一种用法是以什么开头
# 匹配除了5以外的数字
result = re.match('[^5]','0')
3.\d匹配数字,即0-9
import re
ret = re.match("神州\d号","神州6号")
print(ret.group())
运行结果:
神州6号
4.\D匹配非数字,即不是数字
non_obj = re.match("\D", "s")
print(non_obj .group())
运行结果:
s
5.\s匹配空白,即 空格,tab键
match_obj = re.match("hello\sworld", "hello world")
print(match_obj .group())
运行结果:
hello world
6.\S匹配非空白
match_obj = re.match("hello\Sworld", "hello&world")
result = match_obj.group()
print(result)
运行结果:
hello&world
7.\w匹配非特殊字符,即a-z、A-Z、0-9、_、汉字
match_obj = re.match("\w", "A")
result = match_obj.group()
print(result)
运行结果:
A
8.\W匹配特殊字符,即非字母、非数字、非汉字
match_obj = re.match("\W", "&")
result = match_obj.group()
print(result)
运行结果:
&
匹配多个字符
都是与前一个字符搭配
1. 匹配前一个字符出现0次或者无限次,即可有可无*
import re
#需求:匹配一个字符串第一个字母为大写,后面都是小写字母并且这些小写字母可有可无
ret = re.match("[A-Z][a-z]*","X")
print(ret.group())
ret = re.match("[A-Z][a-z]*","XxxX")
print(ret.group())
ret = re.match("[A-Z][a-z]*","Aabcdef")
print(ret.group())
结果
X
Xxx
Aabcdef
2.+匹配前一个字符出现1次或者无限次,即至少有1次
需求:匹配一个字符串,第一个字符是t,最后一个字符串是o,中间至少有一个字符
import re
match_obj = re.match("t.+o", "two")
print(match_obj.group())
结果
two
3.?匹配前一个字符出现1次或者0次,即要么有1次,要么没有
需求:匹配出这样的数据,但是https 这个s可能有,也可能是http 这个s没有
import re
match_obj = re.match("https?", "http")
print(match_obj.group())
结果
https
4.{m}匹配前一个字符出现m次
#需求:匹配出11位数字
import re
ret = re.match("1[35678]\d{9}","15232659861")
print(ret.group())
结果
15232659861
5.{m,n}表示匹配前一个字符出现从m到n次
需求:匹配出,8到20位的密码,可以是大小写英文字母、数字、下划线
import re
ret = re.match("[a-zA-Z0-9_]{8,20}","helloword")
print(ret.group())
结果
helloword
需要强调的是,re.match()是从开头开始匹配,哪怕超过20位也只会匹配20位
import re
ret = re.match("[a-zA-Z0-9_]{8,20}","01234567890123456789xxx")
print(ret.group())
结果
01234567890123456789
匹配开头和结尾
1.^匹配字符串开头
# 匹配以数字开头的数据
import re
match_obj = re.match("^\d.*", "3python")
print(match_obj .group())
结果
3python
2.$匹配字符串结尾
# 匹配以数字结尾的数据
import re
match_obj = re.match(".*\d$", "python5")
print(match_obj .group())
结果
python3
3.^ 和 $
需求: 匹配以数字开头中间内容不管以数字结尾
match_obj = re.match("^\d.*\d$", "4python4")
print(match_obj .group())
结果
4python4
示例1:除了指定字符以外都匹配
需求: 第一个字符除了aeiou的字符都匹配
import re
match_obj = re.match("[^yello]", "h")
结果
h
匹配分组
1.| 匹配左右任意一个表达式
需求:在列表中["apple", "banana", "orange", "pear"],匹配apple和pear
import re
# 水果列表
fruit_list = ["apple", "banana", "orange", "pear"]
# 遍历数据
for value in fruit_list:
# | 匹配左右任意一个表达式
match_obj = re.match("apple|pear", value)
if match_obj:
print("%s是我想要的" % match_obj.group())
else:
print("%s不是我要的" % value)
结果:
apple是我想要的
banana不是我要的
orange不是我要的
pear是我想要的