正则表达式
正则表达式(regular expression)
什么正则表达式?
我们希望只提取出我们所关注的数据,此时就可以用正则表达式
正则表达式就是一种进行数据筛选的表达式
正则表达式就是用一种特殊规则的字符串,来表达对字符串的一种过滤(称作匹配)
什么是原子?
原子就是正则表达式的一个基本组成的单位,每个正则表达式至少要包含一个原子
- 普通字符作为原子
示例:
import re
string = "http://www.baidu.com"
pat = "baidu"
result = re.search(pat,string)
print(result)
运行结果:
<_sre.SRE_Match object; span=(11, 16), match='baidu'>
- 非打印字符作为原子
import re
string = "abc\ndef"
pat = "\n"
result = re.search(pat,string)
print(result)
运行结果:
<_sre.SRE_Match object; span=(3, 4), match='\n'>
通用字符作为原子
\w : 匹配单字符,大小写字母,数字,下划线,等价于[a-zA-Z0-9]
\W : 匹配到任何非单词字符,等于[^a-zA-z0-9]
\d : 匹配到一个数字字符,等价于[0-9]
\D : 匹配到一个非数字字符等价于[^0-9]
\s : 匹配到任何空白字符,包括空格,制表符,换页符等等,等价于[\f\n\t\v]
\S : 匹配到任何非空白字符,等价于[^\f\n\t\v]示例:
import re string = "abcd123gdsa" pat = "\w" #匹配单字符,所以会显示a result = re.search(pat,string) print(result)
运行结果:
<_sre.SRE_Match object; span=(0, 1), match='a'>
- 原子表(表示范围)
匹配大小写字母,数字,下划线 [a-zA-Z0-9]
匹配数字 [0-9]
匹配非数字 [^0-9]
示例:
import re
string = "as123dfzvz23cv"
pat = "[123]+"
result = re.search(pat,string)
print(result)
运行结果:
<_sre.SRE_Match object; span=(2, 5), match='123'>
- 元字符:就是正则表达式中具有一些特殊含义的字符,比如:重复N次前面的字符
"." 匹配除了换行符(\n)以外的任何单个字符
"^" 匹配到字符串开始的位置
"$" 匹配到字符串结束的位置
"*" 匹配0次,1次或者多次前面的原子 等价于{0,}
"?" 匹配0次,1次 等价于{0,1}
"+" 至少可以出现一次(1次或多次) 等价于{1,}
num{n} 前面的数字至少可以出现几次,具体的次数要在{}中体现
num{n,} 前面的数字至少可以出现几次
num{min,max} 前面的数字最少出现min次,最多出现max次
t|s 匹配t|s
() 模式单元,用于提取某一个内容
- 模式修改符
在不改变正则表达式的情况下,通过模式修正符来改变正则表达式的含义从而实现匹配结果的调整
I 匹配时忽略大小写
N 多行匹配
L 本地化识别匹配
S 让”.”匹配换行符
示例:
import re
string = "adfpythonsns"
pat = "Python"
result = re.search(pat,string,re.I)
print(result)
运行结果:
<_sre.SRE_Match object; span=(3, 9), match='python'>
7.贪婪模式和懒惰模式
贪婪就是尽可能多去匹配
懒惰尽可能少的去匹配
贪婪模式示例:
import re
string = "faffafpythonsadfapy"
pat = "p.*y"
result = re.search(pat,string)
print(result)
运行结果:
<_sre.SRE_Match object; span=(6, 19), match='pythonsadfapy'>
懒惰模式示例:
import re
string = "faffafpythonsadfapy"
pat = "p.*?y"
result = re.search(pat,string)
print(result)
运行结果:
<_sre.SRE_Match object; span=(6, 8), match='py'>
正则表达式函数
re.search()
扫描整个字符串并返回第一个成功的匹配,存在多个也只会返回一个
re.match()
尝试从字符串的起始位置匹配,如果不是起始位置的话,match()就返回None
import re
print(re.match("www","www.baidu.com")) #匹配成功
print(re.match("com","www.baidu.com")) #匹配失败
运行结果:
<_sre.SRE_Match object; span=(0, 3), match='www'>
None
re.search()和re.match()的区别:
re.match() 只匹配字符串的开始,如果开始就不符合规则,则匹配失败,返回None
re.search() 匹配整个字符串,直到一个成功的匹配
re.sub()
检索和替换
语法: re.sub(pattern,repl,string)
re.sub(正则表达式,替换字符,被替换的字符串)
-patten 规则
-repl 替换的字符
-string 原始字符串
-count 模式匹配后替换的最大次数,默认0表示替换所有匹配的值
示例:
import re
phone = "123-343-5553 # 这是个电话号码"
#删除注释
# num = re.sub("#.*$","",phone)
num = re.sub("\D","",phone)
print(num)
运行结果:
1233435553
全局匹配函数
re.compile(Pattern) –
用于编译正则表达式,生成一个正则表达式对象供match() , search() 这两个函数来使用
示例,
import re
pattern = re.compile(r"\d+")
resultp = pattern.findall("runoob 123 google 456") #以列表形式返回
print(resultp)
运行结果:
['123', '456']