热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

正则表达式的经验总结

目录正则基础知识1.原子基础字符:非打印字符(\n\t):通用字符(对于经常使用的基础字符进行的封装):原子表(定义一组地位平

目录

正则基础知识

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. 正则表达式匹配获得内容的区别,主要是在有()时,

        举例:

        有这个两个正则表达式

  • .*?
  • (.*?)目标字符串如下
  • 第一个正则表达式匹配的是这个
  • 而后者是这个原因在于括号,加上括号代表你要返回的是什么哪部分

        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]  


  • 推荐阅读
    • 本文详细介绍了 PHP 中对象的生命周期、内存管理和魔术方法的使用,包括对象的自动销毁、析构函数的作用以及各种魔术方法的具体应用场景。 ... [详细]
    • 在软件开发过程中,经常需要将多个项目或模块进行集成和调试,尤其是当项目依赖于第三方开源库(如Cordova、CocoaPods)时。本文介绍了如何在Xcode中高效地进行多项目联合调试,分享了一些实用的技巧和最佳实践,帮助开发者解决常见的调试难题,提高开发效率。 ... [详细]
    • 优化Vite 1.0至2.0升级过程中遇到的某些代码块过大问题解决方案
      本文详细探讨了在将项目从 Vite 1.0 升级到 2.0 的过程中,如何解决某些代码块过大的问题。通过具体的编码示例,文章提供了全面的解决方案,帮助开发者有效优化打包性能。 ... [详细]
    • 在机器学习领域,深入探讨了概率论与数理统计的基础知识,特别是这些理论在数据挖掘中的应用。文章重点分析了偏差(Bias)与方差(Variance)之间的平衡问题,强调了方差反映了不同训练模型之间的差异,例如在K折交叉验证中,不同模型之间的性能差异显著。此外,还讨论了如何通过优化模型选择和参数调整来有效控制这一平衡,以提高模型的泛化能力。 ... [详细]
    • 本文全面解析了 Python 中字符串处理的常用操作与技巧。首先介绍了如何通过 `s.strip()`, `s.lstrip()` 和 `s.rstrip()` 方法去除字符串中的空格和特殊符号。接着,详细讲解了字符串复制的方法,包括使用 `sStr1 = sStr2` 进行简单的赋值复制。此外,还探讨了字符串连接、分割、替换等高级操作,并提供了丰富的示例代码,帮助读者深入理解和掌握这些实用技巧。 ... [详细]
    • 本文记录了 JavaScript 中正则表达式的使用方法和常见操作,包括匹配、替换、搜索等。 ... [详细]
    • 在 JavaScript 中,浮点数的除法运算常常会出现精度问题。本文介绍了一种方法,通过自定义函数来精确控制除法运算结果的小数位数,确保计算结果的准确性。该方法不仅适用于除法,还可以扩展到其他浮点数运算,有效避免了 JavaScript 在处理浮点数时常见的精度误差。 ... [详细]
    • 本文详细解析了一种实用的函数,用于从URL中提取查询参数。该函数通过处理URL中的搜索部分,能够高效地获取并解析出所需的参数值,适用于各种Web开发场景。 ... [详细]
    • 如何使用 `org.apache.tomcat.websocket.server.WsServerContainer.findMapping()` 方法及其代码示例解析 ... [详细]
    • Python 序列图分割与可视化编程入门教程
      本文介绍了如何使用 Python 进行序列图的快速分割与可视化。通过一个实际案例,详细展示了从需求分析到代码实现的全过程。具体包括如何读取序列图数据、应用分割算法以及利用可视化库生成直观的图表,帮助非编程背景的用户也能轻松上手。 ... [详细]
    • 全面解析JavaScript代码注释技巧与标准规范
      在Web前端开发中,JavaScript代码的可读性和维护性至关重要。本文将详细介绍如何有效地使用注释来提高代码的可读性,并探讨JavaScript代码注释的最佳实践和标准规范。通过合理的注释,开发者可以更好地理解和维护复杂的代码逻辑,提升团队协作效率。 ... [详细]
    • 本指南介绍了如何在ASP.NET Web应用程序中利用C#和JavaScript实现基于指纹识别的登录系统。通过集成指纹识别技术,用户无需输入传统的登录ID即可完成身份验证,从而提升用户体验和安全性。我们将详细探讨如何配置和部署这一功能,确保系统的稳定性和可靠性。 ... [详细]
    • 本文探讨了使用JavaScript在不同页面间传递参数的技术方法。具体而言,从a.html页面跳转至b.html时,如何携带参数并使b.html替代当前页面显示,而非新开窗口。文中详细介绍了实现这一功能的代码及注释,帮助开发者更好地理解和应用该技术。 ... [详细]
    • 利用爬虫技术抓取数据,结合Fiddler与Postman在Chrome中的应用优化提交流程
      本文探讨了如何利用爬虫技术抓取目标网站的数据,并结合Fiddler和Postman工具在Chrome浏览器中的应用,优化数据提交流程。通过详细的抓包分析和模拟提交,有效提升了数据抓取的效率和准确性。此外,文章还介绍了如何使用这些工具进行调试和优化,为开发者提供了实用的操作指南。 ... [详细]
    • 本文详细介绍了一种利用 ESP8266 01S 模块构建 Web 服务器的成功实践方案。通过具体的代码示例和详细的步骤说明,帮助读者快速掌握该模块的使用方法。在疫情期间,作者重新审视并研究了这一未被充分利用的模块,最终成功实现了 Web 服务器的功能。本文不仅提供了完整的代码实现,还涵盖了调试过程中遇到的常见问题及其解决方法,为初学者提供了宝贵的参考。 ... [详细]
    author-avatar
    风清淡雅的梦
    这个家伙很懒,什么也没留下!
    PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
    Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有