在Python中使用正则表达式(re模块)

本文详细介绍了正则表达式在Python中的基本功能,如`re.findall()`、`re.finditer()`、`re.match()`和`re.search()`,并通过实际案例演示了如何进行两次筛选,提取特定数据。重点讲解了预加载正则表达式和使用组进行数据提取的方法。
摘要由CSDN通过智能技术生成

注:正则表达式语法的学习链接请点击: 正则表达式

一.导入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 蔡依林

实现了对正则表达式所提取数据的二次提取。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Dorakmon0219

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值