re模块用来使用正则表达式。正则表达式用来对字符串进行搜索的工作。我们最应该掌握正则表达式的查询,更改,删除的功能。特别是做爬虫的时候,re模块就显得格外重要。

1.查询

 import re
a = re.match("abc","aabccc")
b = re.search("abc","aabcc")
print("a =",a)
print("b =",b)
运行结果:
a = None
b = <_sre.SRE_Match object; span=(1, 4), match='abc'>

re.match是从字符串开头开始匹配,如果和匹配字符不同,即便字符串内包含相同内容,返回值也为空。而re.search是匹配字符串内,只要字符串内包含被搜索内容,就有返回值。

这里,查询的结论是无的话,返回值就是None。我们可以把它和if或者while等循环配合起来使用,如果需要调用搜寻结果,需要在返回值后加.group()。

 a = ["abcdef","aaccd","aadfa","adffadsfabc"]
for i in a:
if re.search("abc",i):
print("%s内包含:%s"%(i,re.search("abc",i).group()))
运行结果:
abcdef内包含:abc
adffadsfabc内包含:abc

还有一种查询方法

 a = "123456789aaa123aaa654"
print(re.findall("aaa",a))
运行结果:
['aaa', 'aaa']

re.findall就是把字符串内所有的关键字都搜索出来生成列表输出。

2.更改

 a = "123456789aaa123aaa654"
print("全部更改:",re.sub("aaa","bbb",a))
print("更改指定次数:",re.sub("aaa","bbb",a,count=1))
print("删除搜索内容:",re.sub("aaa","",a))
运行结果:
全部更改: 123456789bbb123bbb654
更改指定次数: 123456789bbb123aaa654
删除搜索内容: 123456789123654

用re.sub可以对对字符串进行更改或删除的操作。注意re.sub后没有.group()的用法。

此外还有一个分割的用法:

 a = "123456789aaa123aaa654"
print(re.split("aaa",a))
运行结果:
['', '', '']

将原字符串按照搜索的关键字分割成一个列表输出。


                                       分                          割                                    线                                                                         


掌握了最基础的语法后,我们要了解一下较为复杂的正则表达式的使用方法了:

首先,我们要先了解正则表达式的表达符号

'.'     默认匹配除\n之外的任意一个字符,若指定flag DOTALL,则匹配任意字符,包括换行
'^' 匹配字符开头,若指定flags MULTILINE,这种也可以匹配上(r"^a","\nabc\neee",flags=re.MULTILINE)
'$' 匹配字符结尾,或e.search("foo$","bfoo\nsdfsf",flags=re.MULTILINE).group()也可以
'*' 匹配*号前的字符0次或多次,re.findall("ab*","cabb3abcbbac") 结果为['abb', 'ab', 'a']
'+' 匹配前一个字符1次或多次,re.findall("ab+","ab+cd+abb+bba") 结果['ab', 'abb']
'?' 匹配前一个字符1次或0次
'{m}' 匹配前一个字符m次
'{n,m}' 匹配前一个字符n到m次,re.findall("ab{1,3}","abb abc abbcbbb") 结果'abb', 'ab', 'abb']
'|' 匹配|左或|右的字符,匹配到先出现的就停止。
'(...)' 分组匹配,re.search("(abc){2}a(123|456)c", "abcabca456c").group() 结果 abcabca456c

还有一些搜索方式

'\A'    只从字符开头匹配,re.search("\Aabc","alexabc") 是匹配不到的
'\Z' 匹配字符结尾,同$
'\d' 匹配数字0-9
'\D' 匹配非数字
'\w' 匹配[A-Za-z0-9]
'\W' 匹配非[A-Za-z0-9]
's' 匹配空白字符、\t、\n、\r , re.search("\s+","ab\tc1\n3").group() 结果 '\t'
'(?P<name>...)' 分组匹配
(?P<name>...)分组匹配:相当于每个关键字前加一个key生成一个字典,比方我们要匹配一个身份证号,匹配规则是前六位数字地址码,八位数字出生日期码,三位数字顺序码和一位数字校验码。
 ID = ""
a = re.search("(?P<address>[0-9]{6})(?P<birthday>[0-9]{8})(?P<order>[0-9]{3})(?P<check>[0-9]{1})",ID).groupdict()
print(a)
运行结果:
{'address': '', 'birthday': '', 'order': '', 'check': ''}

现在,我们可以举个栗子吧了:我们想做一个加法计算器,第一步就是要把两个计算的加数搜索出来,最简单的方式是这样:

 import re
cul = "123+456"
a = re.search("\d+[+]",cul).group()[:-1]
b = re.search("[+]\d+",cul).group()[1:]
print("a = %s,b = %s"%(a,b))
运行结果:
a = 123,b = 456

我们在返回值里用了切片的方法,删除了返回值中的加号“+”。

这时候再想一想:要是a或b之间有小数点怎么办?用这样的方法就不行了吧!我们把cul赋值为"1.23+3.45"运行一下:

运行结果:
a = 23,b = 4

明显不对了,怎么办呢?需要把小数点也加进去

 import re
cul = "1.23+4.56"
a = re.search("\d+[.]\d+[+]",cul).group()[:-1]
b = re.search("[+]\d+[.]\d+",cul).group()[1:]
print("a = %s,b = %s"%(a,b))
运行结果:
a = 1.23,b = 4.56

可是还有个问题,小数点不是每次都有啊,怎么让它自己判断呢?可以加个”?“

 import re
def add(cul):
a = re.search("(\d+)?[.]?\d+[+]",cul).group()[:-1]
b = re.search("[+]\d+[.]?(\d+)?",cul).group()[1:]
print("a = %s,b = %s"%(a,b))
add("1.23+4.56")
add("123+456")
运行结果:
add("1.23+4.56")
add("123+456")

这里有个很关键的问题:

  正则表达式中的字符采用的是转义字符,如果需要匹配的字符为"aa\\bb\\cc"时,每个"\"前都须加一个"\",就成了"aa\\\\bb\\\\cc"在匹配字符串内有”+“、”*“时都需要加上反斜杠。我们可以把匹配的字符串前加"r",就可以不用在每个"\"前都再加上"\",程序也更加直观。

此外,我们还可以把变量套进正则表达式中

 import re
ans = ""
cul = "(6-4)*2"
cul2 = "6-4"
print("简化后:",re.sub("[(]%s[)]"%cul2,ans,cul))#匹配的表达式为一个变量
运行结果:
简化后: 2*2

但这里要注意一下:如果表达式内有加号或乘号时是不能这样使用的,即便在表达式前加"r"也不行,必须把+换成\+

 import re
ans = ""
cul = "(6+4)*2"
cul2 = "6\+4" #这个地方的+或*必须用\+或\*
print("简化后:",re.sub("[(]%s[)]"%cul2,ans,cul))
运行结果:
简化后: 10*2
 

还有一些更复杂的方法,需要我们慢慢研究吧!

Python 常用模块之re 正则表达式的使用的更多相关文章

  1. python 常用模块 time random os模块 sys模块 json & pickle shelve模块 xml模块 configparser hashlib subprocess logging re正则

    python 常用模块 time random os模块 sys模块 json & pickle shelve模块 xml模块 configparser hashlib  subprocess ...

  2. Python常用模块大全

    Python常用模块大全 os模块: os.remove() 删除文件 os.unlink() 删除文件 os.rename() 重命名文件 os.listdir() 列出指定目录下所有文件 os.c ...

  3. Python常用模块小结

    目录 Python常用模块小结 一.Python常用模块小结 1.1 time模块 1.2 datetime模块 1.3 random模块 1.4 os模块 1.5 sys模块 1.6 json模块 ...

  4. Python常用模块之sys

    Python常用模块之sys sys模块提供了一系列有关Python运行环境的变量和函数. 常见用法 sys.argv 可以用sys.argv获取当前正在执行的命令行参数的参数列表(list). 变量 ...

  5. Python常用模块中常用内置函数的具体介绍

    Python作为计算机语言中常用的语言,它具有十分强大的功能,但是你知道Python常用模块I的内置模块中常用内置函数都包括哪些具体的函数吗?以下的文章就是对Python常用模块I的内置模块的常用内置 ...

  6. python——常用模块2

    python--常用模块2 1 logging模块 1.1 函数式简单配置 import logging logging.debug("debug message") loggin ...

  7. python——常用模块

    python--常用模块 1 什么是模块: 模块就是py文件 2 import time #导入时间模块 在Python中,通常有这三种方式来表示时间:时间戳.元组(struct_time).格式化的 ...

  8. Python常用模块——目录

    Python常用模块学习 Python模块和包 Python常用模块time & datetime &random 模块 Python常用模块os & sys & sh ...

  9. python 常用模块之random,os,sys 模块

    python 常用模块random,os,sys 模块 python全栈开发OS模块,Random模块,sys模块 OS模块 os模块是与操作系统交互的一个接口,常见的函数以及用法见一下代码: #OS ...

随机推荐

  1. 用pandas读取excel报错

    用pandas.read_execl()方法读取excel文件报错. 后来导入xlrd第三方库,就好了.

  2. 用R包中heatmap画热图

    一:导入R包及需要画热图的数据 library(pheatmap) data<- read.table("F:/R练习/R测试数据/heatmapdata.txt",head ...

  3. Avatar

    [Avatar] 1.Retargeting of Humanoid animations Retargeting is only possible for humanoid models, wher ...

  4. PLM修改数据库密码

    在WINDCHILL SHELL中执行以下命令: xconfmanager -s wt.pom.dbPassword=数据库密码 -t db/db.properties -p 重启服务

  5. pta l2-18(多项式A除以B)

    题目链接:https://pintia.cn/problem-sets/994805046380707840/problems/994805060372905984 题意:给定两个多项式,求出其做除法 ...

  6. Aladdin and the Flying Carpet

    Aladdin and the Flying Carpet https://cn.vjudge.net/contest/288520#problem/C It's said that Aladdin ...

  7. express 学习札记

    Enjoy yourself! 祝你玩得开心! I have no idea. 我没有头绪. I just made it! 我做到了!  I’ll see to it 我会留意的. Express ...

  8. vue 登录前做校验this.$router.push(location)

    有很多按钮在执行跳转之前,还会执行一系列方法,这时可以使用 this.$router.push(location) 来修改 url,完成跳转 例如:登录按钮,点击时需要先判断验证码等是否正确,此时

  9. TZOJ 2725 See you~(二维树状数组单点更新区间查询)

    描述 Now I am leaving hust acm. In the past two and half years, I learned so many knowledge about Algo ...

  10. ubuntu下tomcat的安装及注册成系统服务

    在ubuntu下tomcat的安装有两种方式,第一种是下载二进制文件,解压安装:第二种则是使用apt-get自动下载.这里不推荐第二种方法安装,因为这种方法安装会像天女散花一样把安装的文件散落在系统的 ...