目录
- 1、正则表达式概述
- 2、re模块
- 3、匹配单个字符
- 4、匹配多个字符
- 5、匹配开头和结尾
- 6、匹配分组
- 7、总结
 
1、正则表达式概述
在实际开发过程中经常会需要查找某些复杂字符串的格式
 正则表达式:记录文本规则的代码
正则表达式特点:
- 语法令人头疼,可读性差
- 通用性强,能够适用于很多编程语言
2、re模块
流程:导入re模块,match匹配数据,group提取数据
#导入re模块
import re
#match匹配数据
result = match(正则表达式,要匹配的字符串)
#group提取数据
result.group()
import re
result = re.match("it","itsma")
info = result.group() #如果没有匹配到,会报错
print(info) #输出it
3、匹配单个字符
. —匹配任意一个字符(除了\n)
 \d —匹配数字0-9
 \D —匹配非数字
 \s — 匹配空白,空格,tab键
 \S ----匹配非空白
 \w ----匹配特殊字符,即a-z,A-Z,_,汉字
 \W ----匹配非特殊字符
import re
result = re.match("it","itsma")
if result:
	info = result.group() #如果没有匹配到,会报错
	print(info) #输出it
else:
	print('没有匹配到')
result = re.match("it","itsma\t")#\t是指tab键
4、匹配多个字符
- —匹配前一个字符出现0次或者无限次,可有可无
- ----匹配前一个字符出现1次或者无限次
 ? ----匹配前一个字符出现1次或者0次
 {m} ----匹配前一个字符出现m次
 {m,n} ----匹配前一个字符出现m次到n次之间的次数
5、匹配开头和结尾
^ 字符串—匹配字符串开头
 字符串$ —匹配字符串结尾
 [^指定字符] —取反,指定字符串以完的其他
6、匹配分组
| ----匹配左右任意一个表达式
 (ab) —括号中的是一个分组
 \num —引用分组num匹配到字符串
 (?P)—分组起别名
 (?P=name)引用别名为name分组匹配到的字符串
需求:
 
 需求1:
import re
fruit = ['apple','banana','orange','pear'] #匹配apple和pear
for value in fruit:
	result = re.match("apple|pear",value)
	if result:
		info = result.group() #如果没有匹配到,会报错
		print("这是我想吃的水果",info) #输出it
	else:
		print('这个不是我想吃的水果',value)
需求2:
import re
result = re.match("[a-zA-Z0-9]{4,20}@(163|126|qq)\.com","1345ab@qq.com")
print(result)
if result:
	info = result.group()
	print(info) #输出it
else:
	print('没匹配到')
需求3:
 默认group(0)代表的是匹配的所有数据, 1:第一组的带括号的数据,2:第二组带括号的数据,
import re
result = re.match("(qq):([1-9]\d{4,11})","qq:123456")
print(result)
if result:
	info = result.group()
	print(info) #输出qq:123456
	type1 = result.group(1)
	print(type1) #输出qq
	num = result.group(2)
	print(num)  #输出123456
else:
	print('没匹配到')
需求4:
 \num —引用分组num匹配到字符串,用之前要括号起来
import re
#result = re.match("<[a-zA-Z4-9]{4}>.*</[a-zA-Z4-9]{4}>","<html>hh</html>")
result = re.match("<([a-zA-Z1-6]{4})>.*</\\1>","<html>hh</html>")
print(result)
if result:
	info = result.group()
	print(info)
else:
	print('没匹配到')
需求5:
 \num —引用分组num匹配到字符串,用之前要括号起来\2
import re
result = re.match("<([a-zA-Z1-6]{4})><([a-zA-Z1-6]{2})>.*</\\2></\\1>","<html><h1>www.itcast.cn</h1></html>")
print(result)
if result:
	info = result.group()
	print(info)
else:
	print('没匹配到')
需求6:
 (?P)—分组起别名
 (?P=name)引用别名为name分组匹配到的字符串
import re
result = re.match("<(?P<name1>[a-zA-Z1-6]{4})><(?P<name2>[a-zA-Z1-6]{2})>.*</(?P=name2)></(?P=name1)>","<html><h1>www.itcast.cn</h1></html>")
print(result)
if result:
	info = result.group()
	print(info)
else:
	print('没匹配到')
7、总结
限定符
 a? —o次或者1次a
 a* ----0次或者多次a
 a+ ----1次以上的a
 a{6} ----6次出现a
 a{2,6} ----6次或者2次出现a
 a{2,} ----2次及以上出现a
 (ab)+ ----1次以上的ab
 (ab)|(cd) — ab或者cd
 元字符
 \d ----数字字符
 \D —非数字字符
 \w —单词字符(英文、数字、下划线)
 \W —非单词字符
 \s —空白字符(换行符、tab)
 \S —非空白字符
 . —任意字符
 \bword\b —\b标注字符的边界
 ^ — 行首
 & — 行尾
 <.+> —贪婪匹配
 <.+?> — 懒惰匹配


















