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. Python Try Except

    Python Try: Except Except 类型一: try: file_size = os.path.getsize('maoyan.csv'); except OSError as err ...

  2. IDEA配置 gradle

    下载解压自己需要的gradle版本:https://gradle.org/releases/(免安装)  配置环境变量 打开命令窗口,输入 gradle -v IDEA配置gradle:file-&g ...

  3. Executors与ThreadPoolExecutor

    最近阿里发布的 Java开发手册中强制线程池不允许使用 Executors 去创建,而是通过 ThreadPoolExecutor 的方式,这样的处理方式让写的同学更加明确线程池的运行规则,规避资源耗 ...

  4. Java中this和super的用法和区别

    super(参数):调用父类中的某一个构造函数(应该为构造函数中的第一条语句). this(参数):调用本类中另一种形式的构造函数(应该为构造函数中的第一条语句). this的实例: package ...

  5. mongodb 副本集部署

    1.安装三节点linux环境:196.168.1.111,196.168.1.112,192.168.1.113(三节点可彼此ping通) 2.三节点安装mongodb,参考https://blog. ...

  6. Dubbo启动过程(Spring方式)详解

    一.使用Spring xml配置方式的启动过程 1. 解析XML,注册Bean 2. 监听Spring事件 3. 启动或关闭dubbo 二.详细过程 1. 解析XML,注册Bean 利用Spring提 ...

  7. CentOS 下搭建Gitlab

    centos7安装部署gitlab服务器   我这里使用的是centos 7 64bit,我试过centos 6也是可以的! 1. 安装依赖软件 yum -y install policycoreut ...

  8. tf.layers.dense()

    tf.layers.dense用法 2018年05月30日 19:09:58 o0haidee0o 阅读数:20426   dense:全连接层 相当于添加一个层,即初学的add_layer()函数 ...

  9. cisco 3850 GBIC报错处理

    今天有用户cisco 3850插入多模千兆光模块后报错日志如下: *Oct 18 13:48:54: %PLATFORM_PM-6-MODULE_ERRDISABLE:The inserted SFP ...

  10. Python: subprocess.Popen()不支持unicode问题解决

    起源: 所下载视频,有音视频分离者,需要合并起来,采用python之subprocess.Popen()调用ffmpeg实现.python版本为2.7.13,而音视频文件路径,有unicode字符者, ...