目录: (正则表达式内容)
-
原子
-
元字符
-
模式修正符
-
贪婪模式和懒惰模式
-
正则表达式函数
-
正则实例
-
原子
原子是正则表达式中最基础的组成单位,每个正则表达式中至少包含一个原子,常见的类型有:
1、 普通字符作为原子
code1:
import re //正则表达式
string ="taoyun"
pat="yun"
rst=re.search(pat,string) #string中查找pat的内容
print(rst)
out:
<re.Match object; span=(6, 7), match='yun'>
2、 非打印换行符作为原子 \n \t
code2:
import re //正则表达式
string =‘’‘taoyun
‘‘’
pat="\n"
rst=re.search(pat,string) #string中查找pat的内容
print(rst)
#pat可为“\n”,”\t”
3、 通用字符作为原子:
\w匹配人一个字母、数字、下划线
\W匹配除字母、数字、下划线
\d十进制数字
\D除十进制数字
\s空白字符
\S除空白字符
code3:
string ="taoyudsghj5346676asddf"
pat="\w\d\d\d" #查找符号此格式的字符
rst=re.search(pat,string)
print(rst)
out:
<re.Match object; span=(9, 13), match='j534'> # pat="\w\d\d\d"
4、 原子表(匹配[]内的任意一个)
code4:
string ="taoyud sghj5346676asddf"
pat="tao[xyz]ud"
pat="tao[^xaz]ud" #^非:除了xaz都可匹配
rst=re.search(pat,string)
print(rst)
out:
<re.Match object; span=(0, 6), match='taoyud'>
<re.Match object; span=(0, 6), match='taoyud'>
- 元字符
所谓的元字符,就是正则表达式中具有特殊含义的字符
1、. 除换行外任意一个字符
2、^ 开始位置
3、$ 结束位置
4、* 0\1\多次
5、? 0\1次
6、+ 1\多次
7、{n} 恰好n次
8、{n,} 至少n次
9、{n,m} 至少n,至多m次
10、| 模式选择符或
11、() 模式单元
code ‘^’:
string ='''taoyudsghj5346676asddf'''
pat="^ao..." #’a’在起始位置才能匹配
rst=re.search(pat,string)
print(rst)
out:
None
code ‘^’:
string ='''taoyudsghj5346676asddf'''
pat="^tao..."
rst=re.search(pat,string)
print(rst)
out:
<re.Match object; span=(0, 6), match='taoyud'>
code ‘’:
string ='''taoyudsghj5346676asddf'''
pat="tao*"
rst=re.search(pat,string) #匹配0\1\多次
print(rst)
out:
<re.Match object; span=(0, 6), match='tao'>
**code ‘.’:
string ='''taoyudsghj5346676asddf'''
pat="tao.*"
rst=re.search(pat,string) #匹配0\1\多次,因为’.’可代表任意字符,且重复出现了多次
print(rst)
out:
<re.Match object; span=(0, 22), match='taoyudsghj5346676asddf'>
code’+’:
string ='''taooooyudsghj5346676asddf'''
pat="tao+" #o为重复出现的,所以匹配多次的o
rst=re.search(pat,string)
print(rst)
out:
<re.Match object; span=(0, 6), match='taoooo'>
- 模式修正符
即可以在不改变正则表达式的情况下,通过模式修正符改变正则表达式的含义,从而实现一些匹配结果的调整等功能
1、 I 匹配时忽略大小写*
2、 M 多行匹配*
3、 L 本地化识别匹配
4、 U unicode
5、 S 让’.’匹配包括换行符*
code ‘I’:
string ='''python'''
pat="Python"
rst=re.search(pat,string,re.I)
print(rst)
out:
<re.Match object; span=(0, 6), match='python'>
- 贪婪模式与懒惰模式
从code即可直观的感受到模式的区别,贪婪为找到p.*y后继续找能到能匹配的字符,懒惰为匹配到p.*y后即完成工作,结果比较精准
#默认为贪婪模式
code:
string ="poythony"
pat1="p.*y"
pat2="p.*?y"#贪婪模式
rst1=re.search(pat1,string)
rst2=re.search(pat2,string)
print(rst)
out:
<re.Match object; span=(0, 8), match='poythony'>
<re.Match object; span=(0, 3), match='poy'>
- 正则表达式函数
1、 re.match
与search的区别为只能从头开始匹配
string ="poythony"
pat="o.*?y"
rst=re.match(pat,string)
print(rst)
out:
None
2、 re.search(前面已讲)
3、 compile全局匹配函数:只要有满足格式的都匹配
code:
string ="poytptyhopqyny"
pat="p.*?y"
rst=re.compile(pat).findall(string)
print(rst)
out:
['poy', 'pty', 'pqy']
- 正则实例
任务1:匹配.com和.cn地址
从“<a href=‘http://www.baidu.com’>
百度首页 ’”匹配出协议、主机、域名
code:
import re
string = "<a href=‘http://www.baidu.com’> 百度首页 </a>’"
pat = "[a-zA-Z]+://[^\s]*[.com|.cn]"
rst=re.compile(pat).findall(string)
print(rst)
out:
['http://www.baidu.com']
分析:
(1)匹配为a-z或A-Z的多个字符(+:1\多次)
(2)主机名一定为非空(^\s),匹配多次
(3)或符号匹配.com和.cn
任务2:匹配电话号码
string = "asfaf021-265465456gdfsgfdgg0773-4564654212fsdfhjksd"
pat = "\d{3}-\d{8}|\d{4}-\d{7}"
rst=re.compile(pat).findall(string)
print(rst)
out:
['021-26546545', '0773-4564654']