什么是正则表达式

正则就是用一些具有特殊含义的符号组合到一起(称为正则表达式)来描述字符或者字符串的方法。或者说:正则就是用来描述一类事物的规则。(在Python中)它内嵌在Python中,并通过 re 模块实现。正则表达式模式被编译成一系列的字节码,然后由用 C 编写的匹配引擎执行。

生活中处处都是正则:

比如我们描述:4条腿你可能会想到的是四条腿的动物或者桌子,椅子等

继续描述:4条腿,活的就只剩下四条腿的动物这一类了

正则表达式格式

re.findall(pattern,string,flags)

pattern:正则表达式

string:被匹配的字符串

flags

匹配原理

匹配字符中的alex

print(re.findall('alex','my name is alex alex is DSB'))

PS:从字符串中找出符合规则的,正则表达式‘alex’就是规则,程序就会先从字符串第一个字符开始匹配,没有匹配上则往后走一个,如果遇到第一个字符匹配成功,则开始从成功被匹配的字符开始往后匹配第二个字符,如不成功则直接往后走一个字符,从头开始匹配,直到表达式全部匹配成功,如全部没有匹配成功则

正则符号对应的功能

正则匹配(findall方法)

import re  #调用re模块

findall方法返回的是一个列表,所有符合表达式的值都存在这个列表中

转义符号 \(取消特殊字符的意义)
print(re.findall('a\.c','a.c a1c aac aAc'))

PS:加上转义符号 \ 就会变成普通符号

字符串末尾匹配 $

print(re.findall('DSB$','alex my name is alex alex is DSB '))  #  $ 表示匹配字符串的末尾

匹配任意字符  .

print(re.findall('a.c','abc a c a1c aaaaaaac a\nc a\tc',re.DOTALL))  # . 代表匹配一个字符,这一个字符可以是除了\n以外的任意字符

匹配指定范围字符 []

print(re.findall('a[0-9]c','a1c a2c aac aaaac aAc'))  #  [ ] 代表匹配一个字符,这一字符必须是指定范围内的,[0-9] [a-zA-Z],只要ac中间是匹配项都会获取
print(re.findall('a[A-Z]c','a1c a2c aac aaaac aAc'))  #ac中间是大写字母都会获取
print(re.findall('a[A-Za-z]c','a1c a2c aac aaaac aAc')) #ac中间是字母,包含大小写均可
print(re.findall('a[A-Za-z][A-Za-z]c','a1c a2c aac aaaac aAc')) # ac中间两个字符必须是大小写字母
print(re.findall('a[+*/-]c','a-c a+c a*c a/c aaac a1c asadfac'))  
print(re.findall('a[^+*/-]c','a-c a+c a*c a/c aaac a1c asadfac'))

PS:正则表达式时候, - 这个符号如果放在中间则表示是范围的意思,所以需要匹配横杠时候放左右两面即可

重复匹配  ? 和 * 和 + 和 {n,m}

print(re.findall('ab?','a ab abb abbb abbbbbbb a1b a+b'))  # ? 左边b这一个字符出现0次或1次

print(re.findall('ab*','a ab abb abbb abbbbbbb a1b a+b'))  # * 左边b这一个字符出现0次或无穷次

print(re.findall('ab+','a ab abb abbb abbbbbbb a1b a+b'))  # + a后面至少有一个b,如果没有则匹配不成功,如果有则表示有多少拿多少

print(re.findall('ab{0,3}','a ab abb abbbb ')) # {n,m} n就是设定表达式右边的数值b出现次数,m就是b出现次数上限,如果m为空就是无穷次

贪婪匹配  .*

print(re.findall('a.*b','a1b22222222b')) #['a1b22222222b']  # .*  默认为贪婪匹配

PS:从a开始就往右面一直找,直到找到最远的b为止

PS:.*合并到一起是一个组合和单纯的.是不一样的意思

 

非贪婪匹配  .*?(推荐使用)

print(re.findall('a.*?b','a1b22222222b'))  #  *?是组合在一起使用的,这里的?只是单纯的非贪婪模式的表示,和重复匹配里的?毫无关系

PS:从a开始找最近的b

或者匹配 |
print(re.findall('company|companies','Too many companies have gone bankrupt, and the next one is my company'))  #查找公司的单词,匹配多个条件

分组法

print(re.findall('compan(?:y|ies)','Too many companies have gone bankrupt, and the next one is my company'))  #分组的开头加?:这是一个固定的用法,表示所取得结果包括组内组外,如果不加?:则表示所取得结果就是组内匹配成功的

print(re.findall('href="(.*?)"','<a href="https://www.baidu.com/1.mp4"><p>"哈哈哈"</p><a href="https://www.baidu #查找网页链接

PS:|是或者的意思

PS:分组法括号前面的是辅助匹配条件,这个条件达到后再去匹配括号里面的,括号里相同的条件值会被取出

正则表达实例

取出表达式中的所有数字

print(re.findall('\D?(\-?\d+\.?\d*)',"1-12*(60+(-40.35/5)-(-4*3))"))

匹配逻辑

先设定 \D?  要判定是否是负数,- 号的前面必须是非数字(也就是括号),所以优先设定一个非数字匹配而且只出现1次  #这是一个辅助匹配

\-?  然后再设定减号出现1次或0次来匹配负数(用转义符 \ 将 - 变成普通符号)

先用 \d 匹配任意数字,然后再设定一个条件 +至少出现一次

用 \.匹配普通字符 .  (用转义符将 . 变成普通的字符 .)去匹配数字.后面的字符 ,加上?设定出现0次或1次

然后用 \d* 匹配无穷个普通数字  (数字后面的小数点不一定是必须出现的,整数肯定是没有的,只有浮点数小数点后面跟数字)小数点后面可能出现无穷的数字

最后将'\D? 后面的表达式全部用()括起来,使用分组法去匹配

取出a\c 这个字符串

print(re.findall('a\\\c','abc a1c a c a\c'))

PS:\在正则表达式中是转义的意思,所以不能单用一个\去匹配,必须用转义符将\转义成普通字符串,如果只用一个 \ 去转义,则程序会默认把\c识别成一组进行转义,由于Python解释器在读取的时候有一个解析过程,即a\\\c解析后就是a\\c,\\就表示普通的 \ 这个符号,所以要加两个\\

re模块的其他方法

search方法

和findall一样的功能都是查找字符串,findall返回的是一个列表,但是search会返回一个对象,并且告诉你这个对象的索引范围位置,但是只找最前面的一个,所以这个方法通常用来判断字符串里面有没有符合我设定规则的,如果有则不会再找下去,没找到就返回None

print(re.search('alex','myalex alex is DSB'))

serach下的.group功能用来返回查找的对象,即返回serach匹配成功的对象,如果对象不存在则报错

print(re.search('alex','myalex alex is DSB').group())

search下的match功能,match表示从头开始匹配,等同于 ^ 这个符号

print(re.search('^alex','alex alex is DSB'))  #加一个 ^ 这个符号则表示从头开始匹配

print(re.match('alex','alex alex is DSB').group())   #match和^一样都是从头开始匹配

re.split方法

正则表达式中的切分法

info='a:=-b*(c'  #将变量中的字母切分出来

print(re.split('[:=*(-]',info))  #直接切分后返回的列表中会有空字符

res=[item for item in re.split('[:=*(-]',info) if len(item) != 0]  #用列表表达式可以剔除空字符
print(res)

PS:如果直接切分会在字典中出现空字符,配合列表解析加判定过滤即可,为什么会出现空字符,因为在分割时候如果遇到表达式中的符号,则左右都是空,则会将空字符放入列表

sub方法(这个方法下flags有很多种可供选择

re.sub(pattern, repl, string, count=0, flags=0)

re.sub 用于替换字符串的匹配项。如果没有匹配到规则,则原字符串不变。

pattern:正则表达式

repl:替换后的字符串

string:需要处理的字符串

count:替换多少次,默认是0,从头到尾做替换

flags:匹配模式

替换字符串中的字符

msg='alex my name is alex alex alex is hahahah'

print(re.sub('^alex','ALEX',msg)) #加^ 则表示值替换开头的

print(re.subn('alex','ALEX',msg)) #返回一个替换后的内容元祖,并且告诉你替换了几处

print(re.sub('alex','SB',msg,flags=re.I))  # 指定模式 re.I 则是表示省略大小写

PS:正则表达式的替换操作,加^这个符号则可以控制替换开头一个

PS:sbu比replace强大的地方就是可以指定替换位置,而replace不能控制

 

匹配出所有每一行末尾指定字符

msg="""
a1231231231231egon
123123sadfsadf2143egon
sdafljsalfdjerwqregon
"""
print(re.findall('egon$',msg,flags=re.M))  #re.M是多行的意思

了解利用sub将字符串替换位置

msg="my name is"

msg="单词1 单词2 单词3"

msg="单词3 单词2 单词1"

print(re.sub('([a-zA-Z]+)([^a-zA-Z]+)([a-zA-Z]+)([^a-zA-Z]+)([a-zA-Z]+)',r'\5\2\3\4\1',msg))

PS:将每一个单词用()进行分组,每一个分组对应一个位置,最后将分组的序号进行排位就行

PS: ^就是取反的意思,即不是字母

compile方法

可以自定义一个正则表达式如果一个正则表达式常用,则可以用compile方法定义成一个变量
pattern=re.compile('href="(.*?)"')  #这里自定义正则表达式
print(pattern.findall('<a href="https://www.baidu.com/1.mp4"><p>"哈哈哈"</p><a href="https://www.baidu.com/2.mp4">'))
print(pattern.findall('<a href="https://www.baidu.com/1.mp4"><p>"哈哈哈"</p><a href="https://www.baidu.com/2.mp4">'))
print(pattern.findall('<a href="https://www.baidu.com/1.mp4"><p>"哈哈哈"</p><a href="https://www.baidu.com/2.mp4">'))
PS:在调用时候直接将字符串传入则可以做匹配

(3)re模块(正则表达式模块)的更多相关文章

  1. s14 第5天 时间模块 随机模块 String模块 shutil模块(文件操作) 文件压缩(zipfile和tarfile)shelve模块 XML模块 ConfigParser配置文件操作模块 hashlib散列模块 Subprocess模块(调用shell) logging模块 正则表达式模块 r字符串和转译

    时间模块 time datatime time.clock(2.7) time.process_time(3.3) 测量处理器运算时间,不包括sleep时间 time.altzone 返回与UTC时间 ...

  2. Python正则表达式模块(re模块)

    Python是我接触到的第一门编程语言,虽然它足够简单,但是对于当时刚刚接触编程语言的我来说还是有些难度的,于是只是了解了一些Python的基本语法,稍微深入一点的地方都没怎么了解.不过,到现在为止, ...

  3. python-Day5-深入正则表达式--冒泡排序-时间复杂度 --常用模块学习:自定义模块--random模块:随机验证码--time & datetime模块

    正则表达式   语法:             mport re #导入模块名 p = re.compile("^[0-9]") #生成要匹配的正则对象 , ^代表从开头匹配,[0 ...

  4. Python中的re模块--正则表达式

    Python中的re模块--正则表达式 使用match从字符串开头匹配 以匹配国内手机号为例,通常手机号为11位,以1开头.大概是这样13509094747,(这个号码是我随便写的,请不要拨打),我们 ...

  5. Python数据分析学习-re正则表达式模块

    正则表达式 为高级的文本模式匹配.抽取.与/或文本形式的搜索和替换功能提供了基础.简单地说,正则表达式(简称为 regex)是一些由字符和特殊符号组成的字符串,它们描述了模式的重复或者表述多个字符,于 ...

  6. Python3 re模块(正则表达式)

    一:什么是正则? 正则就是用一些具有特殊含义的符号组合到一起(称为正则表达式)来描述字符或者字符串的方法.或者说:正则就是用来描述一类事物的规则. (在Python中)它内嵌在Python中,并通过r ...

  7. 5-5 re模块 正则表达式

    1,正则表达式 正则表达式,就是匹配字符串内容的一种规则. 官方定义:正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符.及这些特定字符的组合,组成一个“规则字符串”,这个“规则字 ...

  8. python正则表达式模块re:正则表达式常用字符、常用可选标志位、group与groups、match、search、sub、split,findall、compile、特殊字符转义

    本文内容: 正则表达式常用字符. 常用可选标志位. group与groups. match. search. sub. split findall. compile 特殊字符转义 一些现实例子 首发时 ...

  9. Python 正则表达式模块 (re) 简介

    Python 的 re 模块(Regular Expression 正则表达式)提供各种正则表达式的匹配操作,和 Perl 脚本的正则表达式功能类似,使用这一内嵌于 Python 的语言工具,尽管不能 ...

  10. python模块 re模块与python中运用正则表达式的特点 模块知识详解

    1.re模块和基础方法 2.在python中使用正则表达式的特点和问题 3.使用正则表达式的技巧 4.简单爬虫例子 一.re模块 模块引入; import re 相关知识: 1.查找: (1)find ...

随机推荐

  1. spring boot 2.0+ 错误页面配置

    如果访问了错误的路径,或者后台报错 如果没有一个统一的页面! 或者说页面上展示一堆报错信息,既影响美观,又对用户不友好! 那么如何配置? 定义 ErrorPageConfig,配置错误状态与对应访问路 ...

  2. SSH Secure Shell Client--- the host may be dow

    the host may be down,or there may be a problem with the network connection. Sometimes such problems ...

  3. 20170731xlVba根据数据表和模板表生成新表

    Public Sub SplitData() Dim Wb As Workbook Dim Sht As Worksheet Dim NewSht As Worksheet Dim arr As Va ...

  4. Confluence 6 获得 Active Directory 服务器证书

    上面的步骤说明了如何在你的 Microsoft Active Directory服务器上安装 certification authority (CA).这一步,你需要为你的 Microsoft Act ...

  5. websphere设置企业应用使用的jvm最大最小内存

    websphere设置企业应用使用的jvm最大最小内存 设置jvm 内存的最大最小值.打开was管理控制台  点击应用程序服务器-----server1  点击java和进程管理前面的加号  点击进程 ...

  6. 『科学计算』通过代码理解SoftMax多分类

    SoftMax实际上是Logistic的推广,当分类数为2的时候会退化为Logistic分类 其计算公式和损失函数如下, 梯度如下, 1{条件} 表示True为1,False为0,在下图中亦即对于每个 ...

  7. string类的用法笔记

    要想使用标准C++中string类,必须要包含 #include <string>// 注意是<string>,不是<string.h>,带.h的是C语言中的头文件 ...

  8. 无法使用BIPublisher开发报表

    我的机器是windows7,word版本问word 2010 32bit. 以前BIPublisher(安装的是BIPublisher 10.1.33版本)能正常使用,突然有一天再想使用他的时候,报以 ...

  9. 【转】ASP.NET Core API 版本控制

    几天前,我和我的朋友们使用 ASP.NET Core 开发了一个API ,使用的是GET方式,将一些数据返回到客户端 APP.我们在前端进行了分页,意味着我们将所有数据发送给客户端,然后进行一些dat ...

  10. javascript--- document.write()和 innerHTML的区别

    document.write是直接写入到页面的内容流,如果在写之前没有调用document.open, 浏览器会自动调用open.每次写完关闭之后重新调用该函数,会导致页面被重写. innerHTML ...