热门标签 | 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]  


  • 推荐阅读
    • Python爬虫中使用正则表达式的方法和注意事项
      本文介绍了在Python爬虫中使用正则表达式的方法和注意事项。首先解释了爬虫的四个主要步骤,并强调了正则表达式在数据处理中的重要性。然后详细介绍了正则表达式的概念和用法,包括检索、替换和过滤文本的功能。同时提到了re模块是Python内置的用于处理正则表达式的模块,并给出了使用正则表达式时需要注意的特殊字符转义和原始字符串的用法。通过本文的学习,读者可以掌握在Python爬虫中使用正则表达式的技巧和方法。 ... [详细]
    • Python正则表达式学习记录及常用方法
      本文记录了学习Python正则表达式的过程,介绍了re模块的常用方法re.search,并解释了rawstring的作用。正则表达式是一种方便检查字符串匹配模式的工具,通过本文的学习可以掌握Python中使用正则表达式的基本方法。 ... [详细]
    • 本文详细介绍了Python中正则表达式和re模块的使用方法。首先解释了转义符的作用,以及如何在字符串中包含特殊字符。然后介绍了re模块的功能和常用方法。通过学习本文,读者可以掌握正则表达式的基本概念和使用技巧,进一步提高Python编程能力。 ... [详细]
    • 本文整理了315道Python基础题目及答案,帮助读者检验学习成果。文章介绍了学习Python的途径、Python与其他编程语言的对比、解释型和编译型编程语言的简述、Python解释器的种类和特点、位和字节的关系、以及至少5个PEP8规范。对于想要检验自己学习成果的读者,这些题目将是一个不错的选择。请注意,答案在视频中,本文不提供答案。 ... [详细]
    • 似乎有两种不同的方法可以将字符串转换为字节,如对typeerror的回答所示:str不支持缓冲区接口。这些方法中哪一种比较好或更适合用Python& ... [详细]
    • 本文介绍了lua语言中闭包的特性及其在模式匹配、日期处理、编译和模块化等方面的应用。lua中的闭包是严格遵循词法定界的第一类值,函数可以作为变量自由传递,也可以作为参数传递给其他函数。这些特性使得lua语言具有极大的灵活性,为程序开发带来了便利。 ... [详细]
    • 开发笔记:加密&json&StringIO模块&BytesIO模块
      篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
    • XML介绍与使用的概述及标签规则
      本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
    • 基于dlib的人脸68特征点提取(眨眼张嘴检测)python版本
      文章目录引言开发环境和库流程设计张嘴和闭眼的检测引言(1)利用Dlib官方训练好的模型“shape_predictor_68_face_landmarks.dat”进行68个点标定 ... [详细]
    • 树莓派语音控制的配置方法和步骤
      本文介绍了在树莓派上实现语音控制的配置方法和步骤。首先感谢博主Eoman的帮助,文章参考了他的内容。树莓派的配置需要通过sudo raspi-config进行,然后使用Eoman的控制方法,即安装wiringPi库并编写控制引脚的脚本。具体的安装步骤和脚本编写方法在文章中详细介绍。 ... [详细]
    • 带添加按钮的GridView,item的删除事件
      先上图片效果;gridView无数据时显示添加按钮,有数据时,第一格显示添加按钮,后面显示数据:布局文件:addr_manage.xml<?xmlve ... [详细]
    • node.jsurlsearchparamsAPI哎哎哎 ... [详细]
    • 开发笔记:python协程的理解
      篇首语:本文由编程笔记#小编为大家整理,主要介绍了python协程的理解相关的知识,希望对你有一定的参考价值。一、介绍什么是并发?并发的本质就是 ... [详细]
    • 字符串匹配RabinKarp算法讲解
      问题描述:Rabin-Karp的预处理时间是O(m),匹配时间O((n-m1)m)既然与朴素算法的匹配时间一样,而且还多了一些预处理时间& ... [详细]
    • 2021年最详细的Android屏幕适配方案汇总
      1Android屏幕适配的度量单位和相关概念建议在阅读本文章之前,可以先阅读快乐李同学写的文章《Android屏幕适配的度量单位和相关概念》,这篇文章 ... [详细]
    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社区 版权所有