正则表达式不是一天能学会的!这是我花七天整理的!希望能帮到你

一.正则表达式概念

1.定义

正则表达式,又称规则表达式。(英语:Regular Expression,在代码中常简写为regex、regexp或RE),计算机科学的一个概念。正则表达式通常被用来检索、替换那些符合某个模式(规则)的文本。正则表达式(Regular Expression)是一种文本模式,包括普通字符(例如,a 到 z 之间的字母)和特殊字符(称为"元字符")。正则表达式使用单个字符串来描述、匹配一系列匹配某个句法规则的字符串。

2.表达式列表

正则表达式不是一天能学会的!这是我花七天整理的!希望能帮到你

正则表达式不是一天能学会的!这是我花七天整理的!希望能帮到你

私信菜鸟007有更多的教程!

3.(?iLmsux)为分组设置模式

这里的”i”,“L”,“m”,“s”,“u”,“x”,它们不匹配任何字串,而是表示对应python中re模块当中的(re.I,re.L,re.M,re.S,re.U,re.X)的6种选项。

可以在python源码中看到:

I = IGnorECASE # 忽略大小写
L = LOCALE # 字符集本地化,为了支持多语言版本的字符集使用环境
U = UNICODE # 使用w,W,B这些元字符时将按照UNICODE定义的属性
M = MULTILINE # 多行模式,改变 ^ 和 $ 的行为
S = DOTALL # '.' 的匹配不受限制,包括换行符
X = VERBOSE # 冗余模式,可以忽略正则表达式中的空白和#号的注释

六种模式在正则表达式中可以同时使用多个的,在 python 里面使用按位或运算符 | 同时添加多个模式如:re.compile(”,re.I|re.M|re.S)

4.反斜杠的使用

在一般的编程语言当中,反斜杠“”代表反转义字符,在反斜杠后面加一个字符可以表示一种特定的意思,接下来列举几个常见的转义字符.

正则表达式不是一天能学会的!这是我花七天整理的!希望能帮到你

因为在正则表达式的规则当中,‘’就是转义字符的意思,前面基本语法规则里也有说到,但是在一般的变成语言中,’’也有转义字符的意思,所以,如果我们要是写代码的时候用到正则表达式中的’’的时候,就需要写四个’’,才可以代表一个真正的反斜杠字符,如:“\\”。“\\”:这里的第一个和第三个是在编程语言中起转义的作用,果:“\”,然后在正则表达式中它在进行一次反转义就代表着一个真正的反斜杠字符了。但是在python语言中,我们可以不考虑这个问题。只需要在写好的字符串前面加一个’r’, 告诉编译器这个字符串是个原生字符串,不要转义’’ 。例如,上个例子中的正则表达式可以使用r””表示。因为加上这个’r’,只是告诉python语言不转义这个字符串,但是在正则表达式中还是要符合正则表达式的规则。同样,匹配一个数字的”d”就可以写成r”d”。所以,在python中写正则表达式时,要养成一个前面写’r’的习惯。

5.表达式的应用与区别:

(1).^${}的区别

正则表达式不是一天能学会的!这是我花七天整理的!希望能帮到你

注意:前面的*,+,?等都是贪婪匹配,也就是尽可能匹配,在一个量词后面加?号使其变成惰性匹配

(2)字符集[] [^]

正则表达式不是一天能学会的!这是我花七天整理的!希望能帮到你

(3)转义符

在正则表达式中,有很多有特殊意义的是元字符,比如d和s等,如果要在正则中匹配正常的"d"而不是"数字"就需要对""进行转义,变成'\'。在python中,无论是正则表达式,还是待匹配的内容,都是以字符串的形式出现的,在字符串中也有特殊的含义,本身还需要转义。所以如果匹配一次"d",字符串中要写成'\d',那么正则里就要写成"\\d",这样就太麻烦了。这个时候我们就用到了r'd'这个概念,此时的正则是r'\d'就可以了。

正则表达式不是一天能学会的!这是我花七天整理的!希望能帮到你

(4)贪婪匹配

正则表达式不是一天能学会的!这是我花七天整理的!希望能帮到你

(5)非贪婪匹配

*? 重复任意次,但尽可能少重复
+? 重复1次或更多次,但尽可能少重复
?? 重复0次或1次,但尽可能少重复
{n,m}? 重复n到m次,但尽可能少重复
{n,}? 重复n次以上,但尽可能少重复

(6).*?的用法

. 是任意字符
* 是取 0 至 无限长度
? 是非贪婪模式。
何在一起就是 取尽量少的任意字符,一般不会这么单独写,他大多用在:
.*?x 就是取前面任意长度的字符,直到一个x出现

6.re函数方法总结

正则表达式不是一天能学会的!这是我花七天整理的!希望能帮到你

7.常用函数举例

(1)贪婪与非贪婪模式举例

import re
example = "
test1
test2
" greedPattern = re.compile("
.*
") notGreedPattern = re.compile("
.*?
") greedResult = greedPattern.search(example) notGreedResult = notGreedPattern.search(example) print("greedResult = %s" % greedResult.group()) print("notGreedResult = %s" % notGreedResult.group())

输出结果:

正则表达式不是一天能学会的!这是我花七天整理的!希望能帮到你

(2)complie()

#描述
def compile(pattern,flags=0):
 "Compile a regular expression pattern,returning a pattern object."
 # 生成一个正则表达式模式,返回一个Regex对象
 return _compile(pattern,flags)
#参数说明
pattern: 正则表达式
flags: 用于修改正则表达式的匹配方式,就是我们在基本语法规则中说到的(iLmsux)六种模式,认正常模式

举例:

import re
pattern = re.compile(r"d")
result = pattern.match("123")
print(result.group())
pattern = re.compile(r"abc d",re.I|re.X)""" I = IGnorECASE # 忽略大小写
 X = VERBOSE # 冗余模式,可以忽略正则表达式中的空白和#号的注释"""
result = pattern.match("AbcD")
print(result.group())

输出

正则表达式不是一天能学会的!这是我花七天整理的!希望能帮到你

(3)match()

源码描述:

1. def match(pattern,string,flags=0):
 """Try to apply the pattern at the start of the string,returning a match object,or None if no match was found."""
 # 在字符串的开头匹配pattern,返回Match匹配对象,如果没有不到匹配的对象,返回None。
 return _compile(pattern,flags).match(string)
2. def match(self,pos=0,endpos=-1):
 """Matches zero | more characters at the beginning of the string."""
 pass
 # 可以指定匹配的字符串起始位置
#参数说明
# 其他两个参数与compile()当中的意义一致
string: 需要验证的字符串
pos: 设定开始位置,认0
endpos: 设定结束位置,认-1

举例:

import re
result = re.match(r"a+d","aA123",re.I)
print(result.group())
# 输出结果为aA1 只要pattern匹配完了,则视为成功,并将匹配成功的字符串返回
pattern = re.compile(r"abc d",re.I|re.X)
result = pattern.match("0AbcD5",1,5)
print(result.group())
# 输出结果为AbcD 从第1个位置开始,到第5个位置之前的字符串

(4)search()

源码描述:

1. def search(pattern,flags=0):
 """Scan through string looking for a match to the pattern,or None if no match was found."""
 # 大致意思与match方法相同,不同的地方在于search时整个字符串任意位置匹配,而match时从特定的位置(pos)开始向后仅匹配一次
 return _compile(pattern,flags).search(string)
2. def search(self,endpos=-1):
 """Scan through string looking for a match,and return a corresponding match instance. Return None if no position in the string matches."""
 pass
 # 可以指定字符串的子串进行匹配
#参数与match()中的一致

举例:

import re
pattern = re.compile(r"abc d",re.I|re.X)
result = pattern.search("0A2aBcd7")
print(result.group())
# 输出结果为aBcd 在字符串中任意位置只要匹配到就返回结果
pattern = re.compile(r"abc d",re.I|re.X)
matchResult = pattern.match("0AbcD5")
searchResult = pattern.search("0AbcD5")
print(matchResult)
print(searchResult)
# matchResult的结果是None
# searchResult.group()的结果结果为AbcD
# 因为在pattern中第一个位置是a,但是在字符串中第一个位置是0,所以match方法在这里匹配失败

正则表达式不是一天能学会的!这是我花七天整理的!希望能帮到你

(5)group(),groups()和groupdict()

源码描述:

1.def group(self,*args):
 """Return one or more subgroups of the match."""
 # 返回成功匹配的一个或多个子组
 pass
2.def groups(self,default=None):
 """Return a tuple containing all the subgroups of the match,from 1 up to however many groups are in the pattern."""
 # 以元组的格式返回所有分组匹配到的字符
 pass
3.def groupdict(self,default=None):
 """Return a dictionary containing all the named subgroups of the match,keyed by the subgroup name."""
 # 以字典的格式返回所有分组匹配到的字符
 pass
#参数说明:
group中的*args: 如果参数为一个,就返回一个子串;如果参数有多个,就返回多个子串的元组。如果不传任何参数,和传入0一样,将返回整个匹配子串。
groups中的default: 用于给那些没有匹配到的分组做认值,它的认值是None
groupdict中的default: 用于给那些没有匹配到的分组做认值,它的认值是None

举例:

import re
pattern = re.compile(r"([w]+) ([w]+)")
m = pattern.match("Hello World Hi Python")
print(m.group())
# 输出结果为Hello World 第一个分组成功匹配到Hello第二个成功匹配到World 正则表达式已匹配结束
print(m.group(1))
# 输出结果为Hello 取第一个分组成功匹配到Hello
print(m.group(2))
# 输出结果为World 取第二个分组成功匹配到World
pattern = re.compile(r"([w]+).?([w]+)?")
m = pattern.match("Hello")
print(m.groups())
# 输出结果为('Hello',None) 第一个元素是一个分组匹配到的Hello,因为第二个分组没有匹配到,所以返回None
print(m.groups("Python"))
# 输出结果为('Hello','Python') 因为第二个分组没有匹配到,所以返回在groups中设置的认值
pattern = re.compile(r"(?Pw+) (?Pw+)")
m = pattern.match("Hello Python")
print(m.groupdict())
# 输出结果为{'first_str': 'Hello','last_str': 'Python'} 认值的用法与group

正则表达式不是一天能学会的!这是我花七天整理的!希望能帮到你

(6)findall()

源码描述:

def findall(self,endpos=-1):
 """Return a list of all non-overlapping matches of pattern in string."""
 # 返回字符串中所有匹配成功的子串的列表,
 #重点:返回的是一个列表,没有group方法
 pass
#参数说明
# 与match方法一致

举例:

import re
pattern = re.compile(r'd+')
m = pattern.findall('a1b2c33d4')
print(m)
# 输出['1','2','33','4'] 查找出字符串中的所有数字
m = pattern.findall('a1b2c33d4',6)
print(m)
# 输出['1','3'] 在"1b2c3"中查找

(7)finditer()

源码描述:

def finditer(self,endpos=-1):
 """Return an iterator over all non-overlapping matches for the pattern in string. For each match,the iterator returns a match object."""
 # 返回字符串中所有匹配成功的子串的迭代器
 pass
#参数说明
#与match方法一致

举例:

import re
pattern = re.compile(r'd+')
m = pattern.finditer('a1b2c33d4')
print(m)
# 输出迭代器
print(next(m).group())
# 依次输出匹配到的结果 1

正则表达式不是一天能学会的!这是我花七天整理的!希望能帮到你

(8)split()

源码描述:

def split(self,maxsplit=0):
 """Split string by the occurrences of pattern."""
 # 返回根据匹配到的的子串将字符串分割后成列表
 pass
#参数说明
#maxsplit: 指定最大分割次数,不指定将全部分割。

举例:

import re
pattern = re.compile(r'd+')
m = pattern.split('a1b2c3d4e')
print(m)
# 输出['a','b','c','d','e'] 根据数字,全部分割
m = pattern.split('a1b2c3d4e',3)
print(m)
# 输出['a','d4e'] 只分割三次,后面的不进行分割

9 sub()

源码描述

def sub(self,repl,count=0):
 """Return the string obtained by replacing the leftmost non-overlapping occurrences of pattern in string by the replacement repl."""
 # repl替换掉字符串中匹配到的子串,变成新的字符串返回
 pass
#参数说明
repl: 替补内容
string: 原字符串
count: 替换次数,认全部替换

举例:

import re
pattern = re.compile(r's+')
text = "Process finished with exit code 0"
m = pattern.sub('-',text,3)
print(m)
# 输出结果Process-finished-with-exit code 0 前三个空格被‘-’替换了

10.subn()

源码描述:

def subn(self,count=0):
 """Return the tuple (new_string,number_of_subs_made) found by replacing the leftmost non-overlapping occurrences of pattern with the replacement repl."""
 # 返回一个由替换后的结果和替换的次数组成的元组
 pass
#参数说明
与sub()参数含义一致

举例:

import re
pattern = re.compile(r's+')
text = "Process finished with exit code 0"
m = pattern.subn('-',text)
print(m)
# 输出结果('Process-finished-with-exit-code-0',5)

未完待续。。。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


我最近重新拾起了计算机视觉,借助Python的opencv还有face_recognition库写了个简单的图像识别demo,额外定制了一些内容,原本想打包成exe然后发给朋友,不过在这当中遇到了许多小问题,都解决了,记录一下踩过的坑。 1、Pyinstaller打包过程当中出现warning,跟d
说到Pooling,相信学习过CNN的朋友们都不会感到陌生。Pooling在中文当中的意思是“池化”,在神经网络当中非常常见,通常用的比较多的一种是Max Pooling,具体操作如下图: 结合图像理解,相信你也会大概明白其中的本意。不过Pooling并不是只可以选取2x2的窗口大小,即便是3x3,
记得大一学Python的时候,有一个题目是判断一个数是否是复数。当时觉得比较复杂不好写,就琢磨了一个偷懒的好办法,用异常处理的手段便可以大大程度帮助你简短代码(偷懒)。以下是判断整数和复数的两段小代码: 相信看到这里,你也有所顿悟,能拓展出更多有意思的方法~
文章目录 3 直方图Histogramplot1. 基本直方图的绘制 Basic histogram2. 数据分布与密度信息显示 Control rug and density on seaborn histogram3. 带箱形图的直方图 Histogram with a boxplot on t
文章目录 5 小提琴图Violinplot1. 基础小提琴图绘制 Basic violinplot2. 小提琴图样式自定义 Custom seaborn violinplot3. 小提琴图颜色自定义 Control color of seaborn violinplot4. 分组小提琴图 Group
文章目录 4 核密度图Densityplot1. 基础核密度图绘制 Basic density plot2. 核密度图的区间控制 Control bandwidth of density plot3. 多个变量的核密度图绘制 Density plot of several variables4. 边
首先 import tensorflow as tf tf.argmax(tenso,n)函数会返回tensor中参数指定的维度中的最大值的索引或者向量。当tensor为矩阵返回向量,tensor为向量返回索引号。其中n表示具体参数的维度。 以实际例子为说明: import tensorflow a
seaborn学习笔记章节 seaborn是一个基于matplotlib的Python数据可视化库。seaborn是matplotlib的高级封装,可以绘制有吸引力且信息丰富的统计图形。相对于matplotlib,seaborn语法更简洁,两者关系类似于numpy和pandas之间的关系,seabo
Python ConfigParser教程显示了如何使用ConfigParser在Python中使用配置文件。 文章目录 1 介绍1.1 Python ConfigParser读取文件1.2 Python ConfigParser中的节1.3 Python ConfigParser从字符串中读取数据
1. 处理Excel 电子表格笔记(第12章)(代码下载) 本文主要介绍openpyxl 的2.5.12版处理excel电子表格,原书是2.1.4 版,OpenPyXL 团队会经常发布新版本。不过不用担心,新版本应该在相当长的时间内向后兼容。如果你有新版本,想看看它提供了什么新功能,可以查看Open
1. 发送电子邮件和短信笔记(第16章)(代码下载) 1.1 发送电子邮件 简单邮件传输协议(SMTP)是用于发送电子邮件的协议。SMTP 规定电子邮件应该如何格式化、加密、在邮件服务器之间传递,以及在你点击发送后,计算机要处理的所有其他细节。。但是,你并不需要知道这些技术细节,因为Python 的
文章目录 12 绘图实例(4) Drawing example(4)1. Scatterplot with varying point sizes and hues(relplot)2. Scatterplot with categorical variables(swarmplot)3. Scat
文章目录 10 绘图实例(2) Drawing example(2)1. Grouped violinplots with split violins(violinplot)2. Annotated heatmaps(heatmap)3. Hexbin plot with marginal dist
文章目录 9 绘图实例(1) Drawing example(1)1. Anscombe’s quartet(lmplot)2. Color palette choices(barplot)3. Different cubehelix palettes(kdeplot)4. Distribution
Python装饰器教程展示了如何在Python中使用装饰器基本功能。 文章目录 1 使用教程1.1 Python装饰器简单示例1.2 带@符号的Python装饰器1.3 用参数修饰函数1.4 Python装饰器修改数据1.5 Python多层装饰器1.6 Python装饰器计时示例 2 参考 1 使
1. 用GUI 自动化控制键盘和鼠标第18章 (代码下载) pyautogui模块可以向Windows、OS X 和Linux 发送虚拟按键和鼠标点击。根据使用的操作系统,在安装pyautogui之前,可能需要安装一些其他模块。 Windows: 不需要安装其他模块。OS X: sudo pip3
文章目录 生成文件目录结构多图合并找出文件夹中相似图像 生成文件目录结构 生成文件夹或文件的目录结构,并保存结果。可选是否滤除目录,特定文件以及可以设定最大查找文件结构深度。效果如下: root:[z:/] |--a.py |--image | |--cat1.jpg | |--cat2.jpg |
文章目录 VENN DIAGRAM(维恩图)1. 具有2个分组的基本的维恩图 Venn diagram with 2 groups2. 具有3个组的基本维恩图 Venn diagram with 3 groups3. 自定义维恩图 Custom Venn diagram4. 精致的维恩图 Elabo
mxnet60分钟入门Gluon教程代码下载,适合做过深度学习的人使用。入门教程地址: https://beta.mxnet.io/guide/getting-started/crash-course/index.html mxnet安装方法:pip install mxnet 1 在mxnet中使
文章目录 1 安装2 快速入门2.1 基本用法2.2 输出图像格式2.3 图像style设置2.4 属性2.5 子图和聚类 3 实例4 如何进一步使用python graphviz Graphviz是一款能够自动排版的流程图绘图软件。python graphviz则是graphviz的python实