一、正则表达式与re模块

1 什么是正则表达式?

正则表达式是对字符串(包括普通字符(例如,a 到 z 之间的字母)和特殊字符(称为“元字符”))操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑。正则表达式是一种文本模式,该模式描述在搜索文本时要匹配的一个或多个字符串。

2 正则表达式可以干什么?

  • 快速高效的查找与分析字符串
  • 进行有规律查找比对字符串,也叫:模式匹配
  • 具有查找、比对、匹配、替换、插入、添加、删除等能力。
  • 字符串是编程时涉及到的最多的一种数据结构,对字符串进行操作的需求几乎无处不在。比如我们编写爬虫收集数据,首先都得到网页源码,但是我们要如何提取有效数据呢,这时候我们就需要使用正则表达式来进行匹配了

3 re模块

正则表达式是一个特殊的字符序列,它能帮助你方便的检查一个字符串是否与某种模式匹配。Python 自1.5版本起增加了re 模块,它提供 Perl 风格的正则表达式模式。re 模块使 Python 语言拥有全部的正则表达式功能。

二、正则表达式常用语法:

Python有rtree模块吗 python re模块全称_编程语言

三、re模块中的基本功能:

1.查找

1.1 findall:

匹配所有每一项符合的结果都会放到列表中,作为一个元素

用法:

re.findall('正则表达式','待匹配的字符串',flag)

示例:

ret=re.findall('\d+','东方红5546fuy465胡')
print(ret)

输出结果为:

['5546', '465']

1.2 search:

只匹配符合条件的从左到右的第一个,得到的不是一个结果,而是一个变量,通过这个变量的group方法来获取结果,如果没有匹配到,会返回none,使用group方法会报错。

示例:

ret=re.search('\d+','东方红5546fuy465胡')
print(ret)  
print(ret.group())  
 
ret=re.search('_','东方红5546fuy465胡')
print(ret)   
print(ret.group())

输出结果为:

<_sre.SRE_Match object; span=(3, 7), match='5546'>
5546
None
'NoneType' object has no attribute 'group'

1.3 match:

从头开始匹配,相当于在search中加上一个’^’,即判断开头

示例:

ret=re.match('\d+','东方红5546fuy465胡')
print(ret)  
 
ret1=re.match('\d+','12东方红5546fuy465胡')
print(ret1.group())

输出结果为:

None
12

2.字符串处理:替换切割

2.1 split:

切割

示例:

s='21东方红5546fuy465胡'
ret=re.split('\d+',s)
print(ret)  
 
s='21东方红5546fuy465胡'
ret=re.split('\d',s)#切一个的时候默认前面有一个空字符串
print(ret)

输出结果为:

['', '东方红', 'fuy', '胡']
['', '', '东方红', '', '', '', 'fuy', '', '', '胡']

2.1 sub:

替换

sub(旧的 新的 谁 替换次数(默认全部替换))

示例:

ret=re.sub('\d','@@@','12东方红5546fuy465胡')
print(ret)
 
ret=re.sub('\d+','@@@','12东方红5546fuy465胡')
print(ret)  
 
#subn  返回的是一个元组,元祖的第二个元素是替换的次数
ret=re.subn('\d+','@@@','12东方红5546fuy465胡')
print(ret)

输出结果为:

@@@@@@东方红@@@@@@@@@@@@fuy@@@@@@@@@胡
@@@东方红@@@fuy@@@胡
('@@@东方红@@@fuy@@@胡', 3)

3. re模块的进阶: 时间 空间

3.1 compile(编译的意思):

compile 函数用于编译正则表达式,生成一个正则表达式( Pattern )对象,供 match() 和 search() 这两个函数使用。

提前编译可减少多次正则匹配的运行时间

ret=re.compile('\d+')
print(ret)  
ret1=ret.findall('12东方红5546fuy465胡')
print(ret1)  

ret=re.compile('\d+')
ret1=ret.search('12东方红5546fuy465胡')
print(ret1.group())  
ret2=ret.match('12东方红5546fuy465胡')
print(ret2.group())

输出结果为:

re.compile('\\d+')  #编译后的正则表达式
['12', '5546', '465']
12
12

3.2 findall :

re.findall()
在字符串中找到正则表达式所匹配的所有子串,并返回一个列表,如果没有找到匹配的,则返回空列表。

注意: match 和 search 是匹配一次 findall 匹配所有。

语法格式为:

re.findall(string, pos, endpos)

参数:

  • string 待匹配的字符串。
  • pos 可选参数,指定字符串的起始位置,默认为 0。
  • endpos 可选参数,指定字符串的结束位置,默认为字符串的长度。

实例:

import re

mat=re.compile(r'\d+')#匹配数字

print(mat.findall('abafa 124ddwa56'))
print(mat.findall('abafa 124ddwa56',0,7))#匹配从0位开始,到7位结束

输出:

['124', '56']
['1']

3.3 re.finditer

和 findall 类似,在字符串中找到正则表达式所匹配的所有子串,并把它们作为一个迭代器返回。

re.finditer(pattern, string, flags=0)

实例:

import re

it = re.finditer(r"\d+", "12a32bc43jf3")
for match in it:
    print(match.group())

输出:

12
32
43
3