作者:风清淡雅的梦 | 来源:互联网 | 2023-07-15 16:03
目录
正则基础知识
1.原子
基础字符:
非打印字符(\n \t):
通用字符(对于经常使用的基础字符进行的封装):
原子表(定义一组地位平等的原子):
2.元字符(正则表达式中特殊符号)
3.模式修正
4.主要函数:
1.re.search(pattern,string,flags=0) 在一个字符串中搜索能匹配正则表达式的第一个位置,返回match对象
2.re.match() 从一个字符串的开始位置起匹配正则表达式,返回match对象
3.re.findall() 搜索字符串,以列表类型返回全部能匹配的子串
4.re.split(pattern,string,maxsplit=0,flags=0) 将一个字符串按照正则表达式匹配结果进行分割,返回列表类型,返回的是未匹配的,如果能匹配的在头和尾列表还会加入空格
5.re.finditer() 搜索字符串,返回一个匹配结果的迭代类型,每个迭代元素是match对象
6.re.sub(pattern,repl,string,count,flags) 在一个字符串中替换所有匹配正则表达式的子串,返回替换后的字符串
7.re的match对象 _sre.SRE._Match
match属性
match函数:
8.re的贪婪匹配和最小匹配(那些可以无限次拓展的操作符):
自己的一些经验还有心得
最后附上常用的正则表达式:
[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])
目前在学爬虫,所以用正则表达式做了大量的练习,对于正则有了部分经验,拿出来分享一波
什么是正则表达式?
正则表达式说简单点就是用来匹配字符串中的内容,比如从一段前端页面的网页代码中得到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,或者将字符串中的换行符进行替换为空
- 正则表达式匹配获得内容的区别,主要是在有()时,
举例:
有这个两个正则表达式
.*? (.*?)目标字符串如下第一个正则表达式匹配的是这个而后者是这个原因在于括号,加上括号代表你要返回的是什么哪部分
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]