目录

一、什么是正则表达式

二、正则表达式的基础知识

1. 原子

1)普通字符作为原子

2)非打印字符作为原子

3) 通用字符作为原子

4) 原子表

2. 元字符

1)任意匹配元字符

2)边界限制元字符

3)限定符

4)模式选择符

5)模式单元符

3. 模式修正

4. 懒惰模式和贪婪模式

三、正则表达式常见的函数

1. re.match()

2. re.search()

3. 全局匹配函数

4. re.sub()


我们在进行字符串处理的时候,希望按自定义的规则进行处理,我们将这些规则称为模式。我们使用正则表达式来表示这些规则。

一、什么是正则表达式

正则表达式就是表述字符排列的一套规则,它的功能非常强大,在实际项目中,但主要是用来处理某种特定格式的信息。

在python中,我们主要使用re模块来实现python的正则表达式功能。

二、正则表达式的基础知识

本节主要讲述正则表示如何去写,我们将分别从原子、元字符、模式修改、贪婪模式和懒惰模式等方面进行介绍。关于正则表达式的使用则在下一小节中详细介绍。

1. 原子

原子是正则表达式中的基本组成单元,每一个正则表达式中至少包含一个原子,常见的原子种类有以下几种:

  • 普通字符作为原子。
  • 非打印字符作为原子。
  • 通用字符作为原子。
  • 原子表。

接下来我们分别对这几类进行详细介绍。

     1)普通字符作为原子

普通字符主要指得是字母、数据、下划线。

我们可以使用普通字符组成的正则表达式去查找相应的字符。例如我们的正则表达式为”python”,然后去字符串string中去寻找是否包含符合正则表达式的字符串(“python“):

  1. import re
  2. pattern = "assd"
  3. string = "C:\\Users\\root\\AppData\\Local\\Programs\\Python\\Python37-32" \
  4. "\\python.exe D:\\pycharm\\workspace\\spiderAnalysis\\AI_pie\\main.py"
  5. result = re.search(pattern, string)
  6. print(result)
  7. <re.Match object; span=(56, 62), match='python'>
  8. or
  9. None

   2)非打印字符作为原子

非打印字符主要指的是字符串中的控制字符,例如换行符,空格,tab等。

表2.1列出了几个常见的非打印字符及其含义

表2.1  非打印字符表

序号

符号

含义

1

\n

用于匹配一个换行符

2

\t

用于匹配一个制表符

3

Pycharm中,如果想通过回车实现换行的话,实际在字符串中是没有换行符”\n”的,因为它是通过拼接实现的,自动把换行符给去掉了。

  1. pattern = '\n'
  2. string = "C:\\Users\\root\\AppData\\Local\nPrograms\\Python\\Python37-32" \
  3. "\\python.exe D:\\pycharm\\workspace\\spiderAnalysis\\AI_pie\\main.py"
  4. result = re.search(pattern, string)
  5. #print(string)
  6. #print(result)
  7. '''
  8. C:\\Users\root\AppData\Local
  9. Programs\Python\Python37-32\python.exe D:\pycharm\workspace\spiderAnalysis\AI_pie\main.py
  10. <re.Match object; span=(27, 28), match='\n'>
  11. '''

    3) 通用字符作为原子

接下来介绍通用字符。

所谓通用字符指的是,一个原子可以匹配一类字符。

这在实际项目中非常有用。常见的通用字符及其含义如下表:

表2.2   常见的通用字符及其含义

序号

符号

含义

1

\w

匹配任意一个字母、数字、下划线

2

\W

匹配除了字符数字下划线的其他一个字符

3

\d

匹配一个十进制数字

4

\D

匹配除了十进制数字以外的其他字符

5

\s

匹配一个空格

6

\S

匹配一个除了空格以外的其他字符

       

    4) 原子表

使用原子表来定义一组地位平等的原子,然后匹配的时候会去该原子表的任意一个原子进行匹配,在python中,原子表示用[]来表示。

如[xyz]就是一个原子表,这里面的三个原子’x’,’y’,’z’的的地位完全一致。

  1. pattern1 = "\w\dpython\d[xyz]\w"
  2. pattern2 = "\w\dpython\d[^xyz]\w"
  3. pattern3 = "\w\dpython\d[xyz]\W"
  4. string = "pycharm\a2a222python6\\a2adeepython6\\a2python6xyz\main.py"
  5. print(re.search(pattern1, string))
  6. print(re.search(pattern2, string))
  7. print(re.search(pattern3, string))
  8. '''
  9. <re.Match object; span=(35, 46), match='a2python6xy'>
  10. <re.Match object; span=(11, 22), match='22python6\\a'>
  11. None
  12. '''

原子表的另一种常用的是匹配除了该表中的其他任意一个字符:[^]。例如[^x“[^xyz]py”能匹配”apy”, 无法匹配”xpy”。

2. 元字符

介绍完毕原子的使用,接下来介绍下元字符的使用。

所谓的元字符,指的是在正则表达式中具有的一些特殊含义的字符。比如恰前面重复N次的字符,这些使用原子是很不容易操作的。元字符可以分为任意匹配元字符、边界限制元字符、限定符、模式选择符、模式单元符。

下面是整理的一些常见元字符:

表2.3 常见的元字符及其含义

序号

符号

含义

1

.

匹配出换行符之外的任意字符

2

^

匹配字符串的开始

3

$

匹配字符串的结尾

4

*

匹配0次,1次,多次前面的原子

5

?

匹配0次或1次前面的原子

6

+

匹配一次或多次前面的原子

7

{m}

前面的原子恰好出现m次

8

{m,}

前面的原子最少出现m次

9

{m,n}

前面的原子至少出现m次,最多n次

10

|

模式选择符

11

()

模式单元符

    1)任意匹配元字符

首先介绍任意匹配元字符“.”, 我们可以使用它来匹配除了换行符以外的其他任意字符。例如我们可以使用“. python . . .” 来匹配一个“python”字符前面有1位,后面有3位除了换行符以外的其他任意字符:“apython123”, “1pythonxxx”, “2python333”等等。

  1. pattern1 = "..python..."
  2. string = "pycharm\a2a222python6\\a2adeepython6\\a2python6xyz\main.py"
  3. #print(re.search(pattern1, string))
  4. '''
  5. <re.Match object; span=(11, 22), match='22python6\\a'>
  6. '''

    2)边界限制元字符

接下来我们介绍边界限制元字符。我们使用‘^’来匹配一个字符串的开始,使用“$”来匹配字符串的结尾。eg:

  1. pattern1 = "^hello"
  2. pattern2 = "^hellp"
  3. pattern3 = "python$"
  4. pattern4 = "pthon$"
  5. string = "hello, good morning python"
  6. #print(re.search(pattern1, string))
  7. #print(re.search(pattern2, string))
  8. #print(re.search(pattern3, string))
  9. #print(re.search(pattern4, string))
  10. '''
  11. <re.Match object; span=(0, 5), match='hello'>
  12. None
  13. <re.Match object; span=(20, 26), match='python'>
  14. None
  15. '''

    3)限定符

限定符主要包括:*,+,?,{m},{m,},{m,n}。

“py.*”: 匹配“py”开头的除了换行符的任意长度的字符串。例如

  1. pattern1 = "py.*"
  2. pattern2 = "cd{2}"
  3. pattern3 = "(cd){3,}"
  4. pattern4 = "cd{3,5}"
  5. string = "apycdcdcdcdddddaaaaaaaaaaaaaaaaaaa.a\nbb"
  6. print(re.search(pattern1, string))
  7. print(re.search(pattern2, string))
  8. print(re.search(pattern3, string))
  9. print(re.search(pattern4, string))
  10. '''
  11. <re.Match object; span=(1, 36), match='pycdcdcdcdddddaaaaaaaaaaaaaaaaaaa.a'>
  12. <re.Match object; span=(9, 12), match='cdd'>
  13. <re.Match object; span=(3, 11), match='cdcdcdcd'>
  14. <re.Match object; span=(9, 15), match='cddddd'>
  15. '''

    4)模式选择符

接下来介绍模式选择符“|”。我们可以使用“|”来设置多个模式,使用的时候可以从中选择任意一个模式进行匹配。比如正则表达式”python|php”则既可以匹配“python”也可以匹配”php”。eg:

  1. pattern = "python|php"
  2. string1 = "dseklkjlcphpadepythonsadenkcken,mx"
  3. string2 = "dseklkjlcpnpadepythonsadenkcken,mx"
  4. print(re.search(pattern, string1))
  5. print(re.search(pattern, string2))
  6. '''
  7. <re.Match object; span=(9, 12), match='php'>
  8. <re.Match object; span=(15, 21), match='python'>
  9. '''

    5)模式单元符

模式单元符指的是”()”,我们可以“()”将一组原子组合成一个大原子,使用小括号括起来将他们作为一个整体进行处理。

  1. pattern1 = "(cd){3,}"
  2. pattern2 = "cd{3}"
  3. string1 = "cdcdcdcdcdcdcdcdcdcd"
  4. string2 = "ccccccccccccdddddddddd"
  5. print(re.search(pattern1, string1))
  6. print(re.search(pattern2, string1))
  7. print(re.search(pattern1, string2))
  8. print(re.search(pattern2, string2))
  9. '''
  10. <re.Match object; span=(0, 20), match='cdcdcdcdcdcdcdcdcdcd'>
  11. None
  12. None
  13. <re.Match object; span=(11, 15), match='cddd'>
  14. '''

3. 模式修正

上面我们介绍完了一些常用元字符的使用情况,下面我们讲解模式修改符。所谓的模式修正符指的是在不改变正则表达式的情况下,通过修改模式修正符来改变正则表达式的含义,从而实现一些匹配结果的调整功能。比如我们可以使用模式修正符“I“来忽略大小写。

一些常见的模式修正符如下:

表2.4模式修正符

序号

符号

含义

1

I

匹配是忽略大小写

2

M

多行匹配

3

L

做本地化识别匹配

4

U

根据unicode字符及解析字符

5

S

让‘.’可以匹配任意字符

       

eg:

  1. pattern = "python"
  2. string = "oienchemkfhhanciefnmnasdffaeinpych\n" \
  3. "armworkspacespiderAnalysisPytoncaPYTHON;"
  4. #print(re.search(pattern, string))
  5. #print(re.search(pattern, string, re.I | re.M))
  6. '''
  7. None
  8. <re.Match object; span=(68, 74), match='PYTHON'>
  9. '''

4. 懒惰模式和贪婪模式

贪婪模式的特点是尽可能多的去匹配;懒惰模式的特点是尽可能少的去匹配。

我们举个栗子来间的说明下这两种模式:

  1. pattern1 = "p.*y" #贪婪模式
  2. pattern2 = "p.*?y" #懒惰模式
  3. string = "pysldjefiejcnesdffasdfasdfasdfasdfasdfbbbbbbbbasdffeceadfyyyyyyyybbbbbbbbbbbdeceadfebbbbbbbbbbby"
  4. print(string.__len__())
  5. print(re.search(pattern1, string).span()) #匹配的结果长的话显示不全,因而显示出下标范围
  6. print(re.search(pattern2, string))

通常情况下,如果我们想在某些字符间匹配任意字符,像 “p.*y“ 这样采用的便是贪婪模式,如果想要转化为懒惰模式,则使用 ”p.*?y“ 便可以转换为懒惰模式。

三、正则表达式常见的函数

上节已经介绍完了一些基本的正则表达式的知识,但是这些正则表达式需要和正则表达式函数进行配合才能完成相关的功能。

我们常用的正则表达式函数有re.match(), re.search(), 全局搜索函数, re.sub()等函数。下面我们一一来介绍。

1. re.match()

如果想要从源字符串的起始位置匹配一个模式,我们可以使用re.match()函数来完成。

re.match()的函数格式为:

表3.1   re.match()函数简介

re.match(pattern, string, flag)

pattern

正则表达式

string

带匹配的源字符串

flag

模式修正符

2. re.search()

re.search()函数跟match()函数最大的区别在于search()函数在全文中进行检索并匹配。而match()函数则是在源字符串的开头进行匹配。

表3.2  re.search()函数简介

re.search(pattern, string, flag)

pattern

正则表达式

string

带匹配的源字符串

flag

模式修正符

3. 全局匹配函数

通过在讲解正则表达式的基本规则的时候可以发现,在上述匹配过程中,即使有多个结果符合模式,也只会匹配一个结果,那么怎样才可以将所有满足要求的内容全部匹配出来呢?

思路如下:

1) 使用re.compile()对正则表达式进行预编译

2)编译后,使用findall根据正则表达式从源字符串里将匹配的结果全部找出。

表3.2  全局匹配功能简介

re.compile(pattern).findall(string)

pattern

正则表达式

string

带匹配的源字符串

  1. '''
  2. 5. 全局匹配函数
  3. '''
  4. string = "ecnepythonaskdjllelpythondkljec,pythonmkjklpythondsecml"
  5. result = re.compile(".python..").findall(string)
  6. print(result)
  7. '''
  8. ['epythonas', 'lpythondk', ',pythonmk', 'lpythonds']
  9. '''

4. re.sub()

如果想要根据正则表达式来实现替换源字符串的某些字符串我们可以使用re.sub()来实现, 该函数也是全局寻找并根据设置的max值来决定替换的次数。re.sub()函数格式如下:

表3.4  re.sub()函数简介

re.sub(pattern, rep, string, max)

pattern

正则表达式

rep

要替换成的字符串

string

带匹配的源字符串

max

最多匹配的次数


  1. '''
  2. 6. re.sub函数
  3. '''
  4. string = "ecnepythonaskdjllelpythondkljec,pythonmkjklpythondsecml"
  5. pattern = ".python."
  6. rep = "-PHP-"
  7. result = re.sub(pattern, rep, string, 5)
  8. print(result)
  9. '''
  10. ecn-PHP-skdjlle-PHP-kljec-PHP-kjk-PHP-secml
  11. '''

关于python中yong的正则表达式基本知识、常见用法已经记录完毕。后续如果再实际开发中遇到问题在做记录。

Python中正则表达式简介的更多相关文章

  1. python 中 正则表达式 的应用

    python 中 正则表达式 的应用 最近作业中出现了正则表达式,顺便学习了一下. python比较厉害的一点就是自带对正则表达式的支持,用起来很方便 正则表达式 首先介绍一下什么是正则表达式. 正则 ...

  2. 第11.20节 Python 中正则表达式的扩展功能:后视断言、后视取反

    一. 引言 在<第11.19节 Python 中正则表达式的扩展功能:前视断言和前视取反>中老猿介绍了前视断言和前视取反,与二者对应的还有后视断言和后视取反. 二. (?<=-)后视 ...

  3. Python re 正则表达式简介

    1. 正则表达式基础 1.1. 简单介绍 正则表达式并不是Python的一部分.正则表达式是用于处理字符串的强大工具,拥有自己独特的语法以及一个独立的处理引擎,效率上可能不如str自带的方法,但功能十 ...

  4. python中正则表达式 re.findall 用法

    在python中,通过内嵌集成re模块,程序媛们可以直接调用来实现正则匹配. 其中,re.findall() 函数可以遍历匹配,可以获取字符串中所有匹配的字符串,返回一个列表. 在python源代码中 ...

  5. python中正则表达式re模块详解

    正则表达式是处理字符串的强大工具,它有自己特定的语法结构,有了它,实现字符串的检索,替换,匹配验证都不在话下. 当然,对于爬虫来说,有了它,从HTML里提取想要的信息就非常方便了. 先看一下常用的匹配 ...

  6. python中正则表达式在中文字符串匹配时的坑

    之前一直有使用python 正则表达式来做中文字符串或者中英文数字混合的字符串的匹配,发现有不少情况下会匹配失灵或者结果混乱,并且在不同操作系统上匹配结果也不一致,查了很久都不知道是什么原因.今天终于 ...

  7. js中正则表达式与Python中正则表达式的区别

    今天女票让我帮她写一个js中的正则,来提取电话号码,对于正则规则来说,js与python是基本没有区别的,重点的区别是在一些函数与方法中. python中的正则提取: import re str = ...

  8. Python中正则表达式讲解

    正则表达式是匹配字符串的强大武器,它的核心思想是给字符串定义规则,凡是符合规则的字符串就是匹配了,否则就是不合法的.在介绍Python的用法之前,我们先讲解一下正则表达式的规则,然后再介绍在Pytho ...

  9. 关于Python中正则表达式的反斜杠问题

    之前总是搞不明白正则表达式中的反斜杠的问题.今天经过查阅资料终于搞明白了. 其中最重要的一点就是Python自己的字符串中定义的反斜杠也是转义字符,而正则表达式中的反斜杠也是转义字符,所以正则表达式中 ...

随机推荐

  1. linux笔记1(不全,无图版)随笔

    1.ls 查看当前目录下的所有内容 黑色的是文件,蓝色的是文件夹,也就是目录 2.rm -f anaconda-ks. cfg 彻底删除文件(如不确定,则需要先保存备份,也就是快照) 3.ifconf ...

  2. 【Android面试查漏补缺】之事件分发机制详解

    前言 查漏补缺,查漏补缺,你不知道哪里漏了,怎么补缺呢?本文属于[Android面试查漏补缺]系列文章第一篇,持续更新中,感兴趣的朋友可以[关注+收藏]哦~ 本系列文章是对自己的前段时间面试经历的总结 ...

  3. SpringBoot报错:Error starting ApplicationContext. To display the conditions report re-run your application with 'debug' enabled.

    Spring Boot报错:Error starting ApplicationContext. To display the conditions report re-run your applic ...

  4. CYPEESS USB3.0程序解读之---GPIO

    CPRESS 官方给出的SDK1.1中(目前最新的SDK),提供了大量的例程供我们开发软件的时候作参考,就像STM32的开发一样提供了库一样,但是又不是库,仅仅是参考例程. 首先看一个简单一点的GPI ...

  5. Java课程设计 SSM新闻资讯管理系统 博客论坛管理系统 Java编程 博客系统源代码

    注意:该项目只展示部分功能,如需了解,评论区咨询即可. 1.开发环境 开发语言:Java后台框架:SSM(Spring+SpringMVC+Mybatis)前端技术:HTML+CSS+JavaScri ...

  6. awk-07-IO和printf语句

    IO语句 1.getline 2.getline var 把a文件的行,追加到b文件的结尾 把 a 文件的行替换 b 文件的指定字段 把 a 文件的行替换 b 文件的对应字段 3.command | ...

  7. tomcat下载、安装及配置

    一,下载Tomcat 1.进入官网Http://tomcat.apache.org/,选择download,下载所需要的Tomcat版本. 注意有zip和exe两种格式的 zip(64-bit Win ...

  8. Java:学习什么是多线程

    线程是什么 进程是对CPU的抽象,而线程更细化了进程的运行流程 先看一下这个图 线程和进程的关系有 进程中就是线程在执行,所有(主)线程执行完了进程也就结束了 多个线程从1秒钟是同时运行完成,从1纳秒 ...

  9. 第12篇-认识CodeletMark

    InterpreterCodelet依赖CodeletMark完成自动创建和初始化.CodeletMark继承自ResourceMark,允许自动析构,执行的主要操作就是,会按照Interpreter ...

  10. C#与.NET、CLR、CLI是什么关系?什么是.NET框架

    1.C#与.NET.CLR.CLI是什么关系?什么是.NET框架?      这个问题好专业啊!一句话两句话还真不好说清.您听说过C++中有个COM的概念吧?您听说过JAVA里的虚拟机吧?CLR(公共 ...