目录
1.re.search(pattern,string,flags=0) 在一个字符串中搜索能匹配正则表达式的第一个位置,返回match对象
2.re.match() 从一个字符串的开始位置起匹配正则表达式,返回match对象
3.re.findall() 搜索字符串,以列表类型返回全部能匹配的子串
5.re.finditer() 搜索字符串,返回一个匹配结果的迭代类型,每个迭代元素是match对象
6.re.sub(pattern,repl,string,count,flags) 在一个字符串中替换所有匹配正则表达式的子串,返回替换后的字符串
8.re的贪婪匹配和最小匹配(那些可以无限次拓展的操作符):
\d{3}-\d{8}|\d{4}-\d{7} 国内固定电话的号码
\w+([.+-]\w+)*@\w+([.-]\w+)*\.\w+([.-]\w+)* 匹配邮箱
ip的精准划分(要划分成四段):(([1-9]?\d |1{2}\d|2[0-4]\d|25[0-5]).){3}([1-9]?\d|1{2}\d|2[0-4]\d|25[0-5])
目前在学爬虫,所以用正则表达式做了大量的练习,对于正则有了部分经验,拿出来分享一波
什么是正则表达式?
正则表达式说简单点就是用来匹配字符串中的内容,比如从一段前端页面的网页代码中得到img标签的图片链接,就可以用正则去匹配。
正则基础知识
1.原子
- 基础字符
- 非打印字符
- 通用字符
- 原子表
基础字符:
表达式中最基础的部分。以下为示例:匹配abc
s = 'abc'
re.search('abc',s) # 第一个参数为正则表达式,第二个为源字符串
结果为abc
非打印字符(\n \t):
s = '\n'
re.search('\n',s)
结果为\n
通用字符(对于经常使用的基础字符进行的封装):
\d 匹配一个数字
\D 匹配除数字以为的任意一个字符
\w 匹配一个字符、数字或者下划线
\W 匹配除字符、数字或下划线外的任意一个字符
\s 匹配一个空白字符
\S 匹配除空白字符以为的任意一个字符
原子表(定义一组地位平等的原子):
[abc],a,b,c的地位平等,示例:[abc]python 可以匹配以下字符串 apython bpython cpython
2.元字符(正则表达式中特殊符号)
. 匹配任意单个字符
[^] 非字符集 [^abc]表示非a或b或c的单个字符
* 前一个字符0次或无限次扩展 abc* 表示ab、abcc、abccc、abcccccc .*所有字符
+ 前一个字符1次或无限次扩展 abc+表示abc、abcc、abccc、abcccccc
? 前一个字符0次或1次扩展 abc? 表示ab、abc
| 左右表达式任意一个 abc|def 表示a,b,c或d,e,f
{m} 扩展前一个字符m次 ab{2}c 表示abbc
{m,n}扩展前一个字符m至n次,含n ab{1,2}c 表示abc、abbc
^ 匹配字符串开头 ^abc 表示abc且在一个字符串的开头
$ 匹配字符串结尾$ abc$ 表示abc且在一个字符串的结尾
() 分组标记,内部只能使用|操作符 (abc)表示abc,(abc|def)表示abc、def
3.模式修正
模式修正是对正则匹配时在不修改表达式的情况下,对匹配结果的调整
I 匹配时忽略大小写
M 多行匹配
L 做本地化识别匹配
U 根据Unicode字符解析字符串
S 换行符,也进入匹配。
4.主要函数:
1.re.search(pattern,string,flags=0) 在一个字符串中搜索能匹配正则表达式的第一个位置,返回match对象
pattern:正则表达式的字符串或原生字符串表示
string:待匹配的字符串
flags:正则表达式使用时的控制标记
re.I re.IGNORECASE 忽略正则表达式的大小写,[A-Z]能够匹配小写字符
re.M re.MULTILINE 正则表达式中的^操作符能够将给定字符串的每行当做匹配开始,比如文章可以将每行的开始作为匹配开始
re.S re.DOTALL 正则表达式中的.操作符能够匹配所有字符(主要作用是匹配包括换行符)
2.re.match() 从一个字符串的开始位置起匹配正则表达式,返回match对象
3.re.findall() 搜索字符串,以列表类型返回全部能匹配的子串
4.re.split(pattern,string,maxsplit=0,flags=0) 将一个字符串按照正则表达式匹配结果进行分割,返回列表类型,返回的是未匹配的,如果能匹配的在头和尾列表还会加入空格
maxsplit 最大分割数 剩余部分作为最后一个元素输出
5.re.finditer() 搜索字符串,返回一个匹配结果的迭代类型,每个迭代元素是match对象
6.re.sub(pattern,repl,string,count,flags) 在一个字符串中替换所有匹配正则表达式的子串,返回替换后的字符串
real 替换成哪个字符串
count 最大匹配次数
7.re的match对象 _sre.SRE._Match
match属性
.string 待匹配的字符串
.re 用的正则表达式
.pos 从哪里开始匹配
.endpos 从哪里结束
match函数:
group() 获得匹配后的字符串
start() 匹配字符串在原始字符串的开始位置
end() 匹配字符串在原始字符串的结束位置
span() 返回(.start(),.end())
8.re的贪婪匹配和最小匹配(那些可以无限次拓展的操作符):
RE库默认采用贪婪匹配即匹配最长的字符串,如果需要最小匹配,则需要对以下操作符进行拓展
*? 前一个操作符0次或无限次拓展,最小匹配
+? 前一个操作符1次或无限次拓展,最小匹配
?? 前一个操作符0次或1次拓展,最小匹配
{m,n}? 前一个操作符拓展m至n次 包括n次
自己的一些经验还有心得
- 在拿到的字符串里经常会有换行符号,如果要匹配换行符一定要加上re.S,或者将字符串中的换行符进行替换为空
- 正则表达式匹配获得内容的区别,主要是在有()时,
举例:
有这个两个正则表达式
<li class="gl-item">.*?</a>
<li class="gl-item">(.*?)</a>
目标字符串如下
<li class="gl-item"><a href="#"></a></li>
第一个正则表达式匹配的是这个
<li class="gl-item"><a href="#"></a>
而后者是这个<a href="#">
原因在于括号,加上括号代表你要返回的是什么哪部分
3. 正则表达式的范围能写小点就写小点,因为我发现再用findall函数加这个(.*?jpg|.*?png)正则表达式时,它会先去尝试匹配jpg直到末尾,很有可能出bug,下面是bug举例
<.png">省略一万个字<.jpg> 它的策略是会得到这个非常大的串:<.png">省略一万个字<.jpg>,而不是<.png>,所以你获取的图片格式就有错误
最后附上常用的正则表达式:
-
[1-9]\d{5} 邮政编码
-
[\u4e00-\u9fa5] 匹配中文字符 UTF-8
-
\d{3}-\d{8}|\d{4}-\d{7} 国内固定电话的号码
-
\w+([.+-]\w+)*@\w+([.-]\w+)*\.\w+([.-]\w+)* 匹配邮箱
-
ip的精准划分(要划分成四段):(([1-9]?\d |1{2}\d|2[0-4]\d|25[0-5]).){3}([1-9]?\d|1{2}\d|2[0-4]\d|25[0-5])
0-99 [1-9]?\d
100-199 1\d{2}
200-249 2[0-4]\d
250-255 25[0-5]