注:正则表达式语法的学习链接请点击: 正则表达式
一.导入re模块
import re
二.常用的功能函数
1.re.findall(pattern,string,flags=0)
re.findall()会在字符串string中找到正则表达式pattern所匹配的所有子串, 并返回一个列表, 如果没有找到匹配的, 则返回空列表。flags可以省略。
import re
s="my telephone number is 10086 ,and my girlfriend's telephone number is 10010."
list = re.findall(r'\d+',s)
print(list)
输出结果为:
['10086', '10010']
2.re.finditer(pattern,string,flags=0)
re.finditer()会在字符串string中找到正则表达式pattern所匹配的所有子串, 并返回一个迭代器。flags可以省略。从迭代器中取数据应用到it.group()获得(组)的数据。
import re
s="my telephone number is 10086 ,and my girlfriend's telephone number is 10010."
it = re.finditer(r'\d+',s)
for i in it:
print(i.group())
输出结果为:
10086
10010
3.re.match(pattern,string,flags=0)
从字符串的起始位置匹配(可以认为是在正则表达式前加了^), 匹配成功, 返回一个匹配的对象, 否则返回None.
比如下列代码将无法匹配成功,程序返回None:
import re
s="my telephone number is 10086 ,and my girlfriend's telephone number is 10010."
s = re.match(r'\d+',s)
print(s.group())
代码改为下面这种,将匹配到数据:
import re
s="123my telephone number is 10086 ,and my girlfriend's telephone number is 10010."
s = re.match(r'\d+',s)
print(s.group())
采集到的数据为 123
4.re.search(pattern,string,flags=0)
re.search()会扫描整个字符串并返回第一个成功的匹配。
import re
s="my telephone number is 10086 ,and my girlfriend's telephone number is 10010."
s = re.search(r'\d+',s)
print(s.group())
输出结果为:
10086
5.re.complie(pattern,flags=0)
将正则表达式传入, 并返回一个匹配对象, 一般与其他方法组合使用,这种方式称作预加载正则表达式,是对以上各方式的优化。例如:
import re
s="my telephone number is 10086 ,and my girlfriend's telephone number is 10010."
obj = re.compile(r'\d+')
list= obj.findall(s)
print(list)
补:flags参数的使用
flags是一个可选参数,表示匹配模式,比如忽略大小写,多行模式等,可在以上所有函数中添加该参数(若在预加载函数compile中添加,调用该对象时不用再次添加)。例如:
re.I 忽略大小写
re.L 表示特殊字符集 \w, \W, \b, \B, \s, \S 依赖于当前环境
re.M 多行模式
re.S 即为 . 并且包括换行符在内的任意字符(因为. 不包括换行符)
re.U 表示特殊字符集 \w, \W, \b, \B, \d, \D, \s, \S 依赖于 Unicode 字符属性数据库
re.X 为了增加可读性,忽略空格和 # 后面的注释
三.案例:使用正则表达式的二次筛选提取特定数据
首先看下面这个代码:
import re
s="""
<div class='jay'><span id='1'>周杰伦</span></div>64645
<div class='joker'><span id='2'>薛之谦</span></div>dsdgs
<div class='eason'><span id='3'>陈奕迅</span></div>sdgg
<div class='jj'><span id='4'>林俊杰</span></div>dsgdsg
<div class='jolin'><span id='5'>蔡依林</span></div>dsgdsg
"""
#预加载正则表达式
obj = re.compile(r"<div class='.*?'><span id='\d+'>.*?</span></div>",re.S)
it = obj.finditer(s)
for i in it:
print(i.group())
该代码提取的结果为:
<div class='jay'><span id='1'>周杰伦</span></div>
<div class='joker'><span id='2'>薛之谦</span></div>
<div class='eason'><span id='3'>陈奕迅</span></div>
<div class='jj'><span id='4'>林俊杰</span></div>
<div class='jolin'><span id='5'>蔡依林</span></div>
这是正则表达式完成了第一次筛选。
而我们如果要想在该次正则提取到的数据中,取出类似'jay'和'周杰伦'这样的数据,就要经过第二次筛选,此时要用到(组)这个概念。
(组)的形式为 (?P<name>pattern) pattern为选中的正则表达式组,name即是该表达式组的组名。可以通过.group(name)来提取组中的数据。例如:
import re
s="""
<div class='jay'><span id='1'>周杰伦</span></div>64645
<div class='joker'><span id='2'>薛之谦</span></div>dsdgs
<div class='eason'><span id='3'>陈奕迅</span></div>sdgg
<div class='jj'><span id='4'>林俊杰</span></div>dsgdsg
<div class='jolin'><span id='5'>蔡依林</span></div>dsgdsg
"""
#预加载正则表达式
obj = re.compile(r"<div class='(?P<ss>.*?)'><span id='\d+'>(?P<name>.*?)</span></div>",re.S)
it = obj.finditer(s)
for i in it:
print(i.group('ss'),i.group('name'),sep=' ')
该代码相对上一个代码唯一的改动即为预加载函数那一行代码。运行结果为:
jay 周杰伦
joker 薛之谦
eason 陈奕迅
jj 林俊杰
jolin 蔡依林
实现了对正则表达式所提取数据的二次提取。