昨天学到了正则表达式基础知识 :原子
今天开始学习第二个基础知识:元字符
元字符
就是正则表达式中含有特殊含义的一些字符
常见的元字符及含义
符号
|
含义
|
.
|
匹配除换行符以外 的任意字符
|
^
|
匹配字符串的开始位置
|
$
|
匹配字符串的结束位置
|
*
|
匹配0次,1次,或多次前面的原子
|
?
|
匹配0次或一次前面的原子
|
+
|
匹配一次或多次前面的原子
|
{n}
|
前面的原子恰好出现n次
|
{n,}
|
前面的原子至少出现n次
|
{n,m}
|
前面的原子至少出现n次,至多出现m次
|
|
|
模式选择符
|
()
|
模式单元符
|
具体的说,元字符分为:
(1)任意匹配元字符(2)边界限制元字符(3)限定符(4)模式选择符(5)模式单元符
下面用程序来观察使用方法
import re
string1="abcdfphp345pythony_py"#我们分别让string1与下面的pattern进行匹配
pattern1=".python..."#.是匹配除了换行符以外的字符
pattern2="^abd"
pattern3="^abc"
pattern4="py$"
pattern5="ay$"
pattern6="py.*n"
pattern7="cd{2}"
pattern8="cd{3,}"
pattern9="python|php"#可以把|当成‘或’理解
pattern10="(cd){1,}"#小括号里会被当成一个整体使用,这里的意思是cd会至少出现一次
pattern11="cd{1,}"#这里就是d会至少出现一次
print(re.search(pattern1,string1))
print(re.search(pattern2,string1))
print(re.search(pattern3,string1))
print(re.search(pattern4,string1))
print(re.search(pattern5,string1))
print(re.search(pattern6,string1))
print(re.search(pattern7,string1))
print(re.search(pattern8,string1))
print(re.search(pattern9,string1))
print(re.search(pattern10,string1))
print(re.search(pattern11,string1))
#结果:
#<_sre.SRE_Match object; span=(10, 20), match='5pythony_p'>
#None
#<_sre.SRE_Match object; span=(0, 3), match='abc'>
#<_sre.SRE_Match object; span=(19, 21), match='py'>
#None
#<_sre.SRE_Match object; span=(11, 17), match='python'>
#None
#None
#<_sre.SRE_Match object; span=(5, 8), match='php'>
#<_sre.SRE_Match object; span=(2, 4), match='cd'>
#<_sre.SRE_Match object; span=(2, 4), match='cd'>
模式修正
模式修正符就是在不改变正则表达式的情况下通过模式修正符改变正则表达式的含义
常见如下
符号
|
含义
|
I
|
匹配时忽略大小写
|
M
|
多行匹配
|
L
|
做本地化识别
|
U
|
根据Unicode字符及解析字符
|
S
|
让.匹配包括换行符,使用后.就可以匹配任意字符了
|
通过re.search(pattern1,string,re.I)修改即可
贪婪模式与懒惰模式
贪婪模式核心就是尽可能多的匹配,懒惰模式就是尽可能少的匹配。
pattern1="p.*y"#贪婪模式
pattern2="p.*?y"#懒惰模式,采用的就是就近匹配原则
print(re.search(pattern1,string1))
print(re.search(pattern2,string1))
#结果
#<_sre.SRE_Match object; span=(5, 21), match='php345pythony_py'>
#<_sre.SRE_Match object; span=(5, 13), match='php345py'>
如果我们想在字符间匹配任意字符,如“p.*y”默认是懒惰模式,通常在对应的.*后面加上?就可以从贪婪模式转为懒惰模式
正则表达式常见函数
直接用代码理解
import re
string="dpythonhbaigdukpythonabvjsvawegadbkvj"
pattern =".python."
print(re.match(pattern,string))
#会从string起始位置(开头)开始匹配,不满足返回None,满足则返回匹配结果
#后面的不会匹配到
print(re.match(pattern,string).span())#会输出匹配结果在源字符串的位置
print(re.search(pattern,string))#会查找整个字符串得到匹配结果
上述每次只能匹配一个内容
如何将符合模式的内容全部匹配出来?
1:使用re.compile()对正则表达式进行预编译。
2:编译后,使用findall()根据正则表达式从源字符中将匹配内容全部找出
#pattern1=re.compile(".python.")
#print(pattern1.findall(string))
print(re.compile(pattern).findall(string))
如果想替换字符串可以使用re.sub()方法
格式:re.sub(pattern 正则表达式,rep要替换的字符,string源字符串,max最多替换次数)
如
re.sub(pattern."php",string,2)
常用实例
匹配.com或.cn的后缀URL
pattern="[a-zA-Z]+://[^\s]*[.com|.cn]"
string="<a href='http://www.baidu.com'>百度首页</a>"
result=re.search(pattern,string)
print(result)
匹配电话号码:
patternphone="\d{4}-\d{7}|\d{3}-\d{8}"
匹配电子邮件
patternemail="\w+([.+-]\w+)*@\w+([.-]\w+)*\.\w+([.-]\w+)*"
正则就到这,明天开始学习cookie相关知识
此文是我在学习《精通Python网络爬虫》(韦玮著)的总结,纯手打。