一、正则表达式
1.简介
正则表达式,又称规则表达式,(Regular Expression,在代码中常简写为regex、regexp或RE),是一种文本模式,包括普通字符(例如,a 到 z 之间的字母)和特殊字符(称为"元字符"),是计算机科学的一个概念。正则表达式是对字符串(包括普通字符(例如,a 到 z 之间的字母)和特殊字符(称为“元字符”))操作的一种逻辑公式,就是用事先定义好的一些特定字符及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑。正则表达式是一种文本模式,该模式描述在搜索文本时要匹配的一个或多个字符串。正则表达式使用单个字符串来描述、匹配一系列匹配某个句法规则的字符串,通常被用来检索、替换那些符合某个模式(规则)的文本。
许多程序设计语言都支持利用正则表达式进行字符串操作。例如,在Perl中就内建了一个功能强大的正则表达式引擎。正则表达式这个概念最初是由Unix中的工具软件(例如sed和grep)普及开来的,后来在广泛运用于Scala 、PHP、C# 、Java、C++ 、Objective-c、Perl 、Swift、VBScript 、Javascript、Ruby 以及Python等等。正则表达式通常缩写成“regex”,单数有regexp、regex,复数有regexps、regexes、regexen。
2.概念
正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑。
3.目的
给定一个正则表达式和另一个字符串,我们可以达到如下的目的:
- 判断给定的字符串是否符合正则表达式的过滤逻辑(称作“匹配”):
- 可以通过正则表达式,从字符串中获取我们想要的特定部分。
4.特点
正则表达式的特点是:
- 灵活性、逻辑性和功能性非常强;
- 可以迅速地用极简单的方式达到字符串的复杂控制。
- 对于刚接触的人来说,比较晦涩难懂。
二、Re库
re库是Python自带的标准库,不需要安装即可使用:
Re库默认采用贪婪匹配,即输出匹配最长的子串
import re
模块常用函数:
1.re.match()
基础语法形式为:
re.match(pattern,string,flags=0)
函数功能为 :从一个字符串的开始位置起匹配正则表达式,返回match对象。如果开始没有匹配到,不管后边有没有能符合匹配的,都打印不出结果,这是和search的区别。
参数说明:
pattern:匹配目标对象的正则表达式pattern或原生字符串表示
string:匹配的字符串
flags:正则表达式使用时的控制标记
其中flags可选参数有:
参数 说明
re.l/re.IGNORECASE 忽略大小写
re.M/re.MULTILINE 多行模式,改变‘^'和'$'的行为
re.S/re.DOTALL 点'.'的任意匹配模式,改变’.‘的行为
re.L/re.LOCALE
使预定字符类\w\W\b\B\s\S取决于当前区域设定
re.U/re.UNICODE 使预定字符类\w\W\b\B\s\S\d\D取决于unicode定义的字符属性
re.X/re.VERBOSE 详细模式。这个模式下正则表达式可以是多行,忽略空白字符,并且可以加入注释
我们把复杂的匹配放到第三章再写,这里我们仅简单展示一下该函数的用法和效果:
strings='Fanstuck wants to leave alone' print(re.match('Fanstuck',strings)) #out: <re.Match object; span=(0, 8), match='Fanstuck'>
2.fullmatch()
基础语法格式为:
fullmatch(pattern, string, flags=0)
参数说明:
pattern:匹配目标对象的正则表达式pattern或原生字符串表示
string:匹配的字符串
flags:正则表达式使用时的控制标记
函数功能为 :尝试将正则表达式pattern应用于所有字符串string,如果匹配成功,返回匹配对象;如果找不到匹配,则为“None”。
用法效果展示:
strings='Fanstuck wants to leave alone' print(re.fullmatch('Fanstuck wants to leave alone',strings)) #out: <re.Match object; span=(0, 29), match='Fanstuck wants to leave alone'>
该函数为贪婪规则指定的pattern都必须完全和strings长度和字符一一对应,否则就是None:
strings='Fanstuck wants to leave alone' print(re.fullmatch('Fanstuck wants to leave alon',strings)) #out: None
3.search()
基础语法格式为:
search(pattern, string, flags=0)
参数说明:
pattern:匹配目标对象的正则表达式pattern或原生字符串表示
string:匹配的字符串
flags:正则表达式使用时的控制标记
函数功能为 :扫描字符串string以查找与正则表达式pattern的匹配项,返回匹配对象;如果找不到匹配,则为“None”。 re.search 匹配整个字符串,直到找到一个匹配。
strings='Fanstuck wants to leave alone' print(re.search('alone',strings)) #out:<re.Match object; span=(24, 29), match='alone'>
strings='Fanstuck wants to leave alone' print(re.search('die',strings)) #out:None
4. sub()
基本语法格式为:
sub(pattern, repl, string, count=0, flags=0)
参数说明:
- pattern:匹配目标对象的正则表达式pattern或原生字符串表示
- repl:将匹配到的pattern替换为repl
- string:匹配的字符串
- count:模式匹配后替换的最大次数,默认 0 表示替换所有的匹配
- flags:正则表达式使用时的控制标记
strings='Fanstuck wants to leave alone alonely' print(re.sub('leave','die',strings)) #out:Fanstuck wants to die alone alonely
strings='Fanstuck wants to leave alone alonely' print(re.sub('alone','sad',strings)) #out:Fanstuck wants to leave sad sadly
5.subn()
基础语法格式为:
subn(pattern, repl, string, count=0, flags=0)
参数说明:
pattern:匹配目标对象的正则表达式pattern或原生字符串表示
repl:将匹配到的pattern替换为repl
string:匹配的字符串
count:模式匹配后替换的最大次数,默认 0 表示替换所有的匹配
flags:正则表达式使用时的控制标记
与前一个函数sub相比,无非就是增加了一个次数:
strings='Fanstuck wants to leave alone alonely' print(re.subn('alone','sad',strings)) #out:('Fanstuck wants to leave sad sadly', 2)
但是转化为字典dict或者是用于pandas都是比较方便的,不用在统计出匹配了多少个字段。
6.findall()
基础语法格式为:
findall(pattern, string, flags=0) 或 findall(pattern,string, pos, endpos)
参数说明:
pattern:匹配目标对象的正则表达式pattern或原生字符串表示
string:匹配的字符串
flags:正则表达式使用时的控制标记
pos:可选参数,指定字符串的起始位置,默认为 0。
endpos:可选参数,指定字符串的结束位置,默认为字符串的长度
函数功能为 :在字符串string中匹配所有符合正则表达式pattern的对象,并把这些对象通过列表list的形式返回。
strings='Fanstuck wants to leave alone alonely' print(re.findall('alone',strings)) #out:['alone', 'alone']
strings='Fanstuck wants to leave alone alonely' print(re.findall('alonely',strings)) #out:['alonely']
strings='Fanstuck wants to leave alone alonely' pattern=re.compile('a') print(pattern.findall(strings,0,30))
7.finditer()
基础语法格式为:
finditer(pattern, string, flags=0)
参数说明:
- pattern:匹配目标对象的正则表达式pattern或原生字符串表示
- string:匹配的字符串
- flags:正则表达式使用时的控制标记
函数功能为:在字符串string中匹配所有符合正则表达式pattern的对象,并把这些对象通过迭代器的形式返回。
strings='Fanstuck wants to leave alone alonely' result=re.finditer('alone',strings) for i in result: print(i) #out:<re.Match object; span=(24, 29), match='alone'> #out:<re.Match object; span=(30, 35), match='alone'>
8.compile()
基础语法格式为:
compile(pattern, flags=0)
- pattern:匹配目标对象的正则表达式pattern或原生字符串表示
- flags:正则表达式使用时的控制标记
compile 函数用于编译正则表达式,生成一个正则表达式( Pattern )对象,供 match() 和 search() 这两个函数使用。
strings='Fanstuck wants to leave alone alonely' pattern=re.compile('to') pattern.search(strings) #out:<re.Match object; span=(15, 17), match='to'>
strings='Fanstuck wants to leave alone alonely' pattern=re.compile('to') object_search=pattern.search(strings) object_search.group() #out:'to' object_search.start() #out:15 object_search.end() #out:17 object_search.span() #out:(15,17)
9. splite()
基础语法格式为:
re.splite(pattern, string, maxsplit=0, flags=0)
参数说明:
pattern:匹配目标对象的正则表达式pattern或原生字符串表示
string:匹配的字符串
maxsplit:分隔次数,maxsplit=1 分隔一次,默认为 0,不限制次数
flags:正则表达式使用时的控制标记
pattern匹配的子串来分割string,如果pattern里使用了圆括号,那么被pattern匹配到的串也将作为返回值列表的一部分,maxsplit为最多被分割的字符串个数。
strings='Fanstuck wants to leave alone alonely' re.split(r' ', strings) #out:['Fanstuck', 'wants', 'to', 'leave', 'alone', 'alonely']
strings='Fanstuck wants to leave alone alonely' re.split(r' ', strings,maxsplit=2) #out:['Fanstuck', 'wants', 'to leave alone alonely']
strings='Fanstuck wants to leave alone alonely' re.split(r'( )', strings,maxsplit=2) #out:['Fanstuck', ' ', 'wants', ' ', 'to leave alone alonely']
10.Match对象和Pattern对象
re.match()、re.search()成功匹配的话都会返回一个Match对象,它包含了关于此次匹配的信息,可以使用Match提供的属性或方法来获取这些信息;Pattern对象对象由re.compile()生成,而且方法用处也是一样的。
strings='Fanstuck wants to leave alone alonely' pattern=re.compile('to') object_search=pattern.search(strings) object_search.string #out:'Fanstuck wants to leave alone alonely' object_search.re #out:re.compile(r'to', re.UNICODE) object_search.pos #out:0 (开始匹配的位置) object_search.endpos #out:37(结束匹配的位置) object_search.lastindex #out:None object_search.lastgroup #out:None object_search.groupdict() #out:{} object_search.group() #out:'to' object_search.start() #out:15 object_search.end() #out:17 object_search.span() #out:(15,17)