正则表达式的经验总结

目录

正则基础知识

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次

自己的一些经验还有心得

  1. 在拿到的字符串里经常会有换行符号,如果要匹配换行符一定要加上re.S,或者将字符串中的换行符进行替换为空
  2. 正则表达式匹配获得内容的区别,主要是在有()时,

        举例:

        有这个两个正则表达式

        <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]  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值