Python 常用模块之re 正则表达式的使用
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 正则表达式的使用的更多相关文章
- 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 ...
- Python常用模块大全
Python常用模块大全 os模块: os.remove() 删除文件 os.unlink() 删除文件 os.rename() 重命名文件 os.listdir() 列出指定目录下所有文件 os.c ...
- Python常用模块小结
目录 Python常用模块小结 一.Python常用模块小结 1.1 time模块 1.2 datetime模块 1.3 random模块 1.4 os模块 1.5 sys模块 1.6 json模块 ...
- Python常用模块之sys
Python常用模块之sys sys模块提供了一系列有关Python运行环境的变量和函数. 常见用法 sys.argv 可以用sys.argv获取当前正在执行的命令行参数的参数列表(list). 变量 ...
- Python常用模块中常用内置函数的具体介绍
Python作为计算机语言中常用的语言,它具有十分强大的功能,但是你知道Python常用模块I的内置模块中常用内置函数都包括哪些具体的函数吗?以下的文章就是对Python常用模块I的内置模块的常用内置 ...
- python——常用模块2
python--常用模块2 1 logging模块 1.1 函数式简单配置 import logging logging.debug("debug message") loggin ...
- python——常用模块
python--常用模块 1 什么是模块: 模块就是py文件 2 import time #导入时间模块 在Python中,通常有这三种方式来表示时间:时间戳.元组(struct_time).格式化的 ...
- Python常用模块——目录
Python常用模块学习 Python模块和包 Python常用模块time & datetime &random 模块 Python常用模块os & sys & sh ...
- python 常用模块之random,os,sys 模块
python 常用模块random,os,sys 模块 python全栈开发OS模块,Random模块,sys模块 OS模块 os模块是与操作系统交互的一个接口,常见的函数以及用法见一下代码: #OS ...
随机推荐
- crontab -e文件存放路径
crontab -e结果存放在/var/spool/cron/crontabs中
- centos 升级sqlite3
1.yum remove sqlite3 2. 下载: wget -O sqlite-autoconf-.tar.gz https://www.sqlite.org/2019/sqlite-autoc ...
- Java将一个字符串的首位改为大写后边改为小写的实现,String
Java将一个字符串的首位改为大写后边改为小写的实现,String 思路: 获取首字母, charAt(0) substring(0,1) 转成大写 toUpperCase() 转大写hellO=== ...
- cakePHP模型内置回调函数afterFind()的使用。
在用find获取数据后,我们要对所获取到的数据做一些处理,这时,直接在模型层覆盖cakephp内置的回调函数,使用find时会自动调用. 其中$baomings 就是find 到的 $this-> ...
- 运行PowerShell脚本
[运行PowerShell脚本] powershell脚本以ps1为扩展名.最的一个是数字1,不是字母l. 当右键ps1文件时,会有用powershell运行的选项,选中这个选项即可运行. 团体pow ...
- versionCode & versionName
[versionCode & versionName] Android的版本可以在androidmainfest.xml中定义,主要有android:versionCode和android:v ...
- linux中weblogic相关命令操作
在weblogic的目录下找到bin目录,其中有startWeblogic.sh.startManagerWeblogic.sh等 首先需要启动startWeblogic.sh,这个是管理服务,也就是 ...
- Linq to sql 之 ExecuteQuery 错误:指定的转换无效
问题:通过dbContext.ExecuteQuery 得到数据并赋值给一个集合. 代码: public IEnumerable<LeaveCodeSum> GetLeavTotal(st ...
- Java System
从jdk10中摘录自认为几个比较重要的方法 系统类包含几个有用的属性和方法.它不能被实例化. 系统类提供的工具包括标准输入.标准输出和错误输出流:对外部定义的属性和环境变量的访问:加载文件和库的方法: ...
- Django model 中的 class Meta 详解
Django model 中的 class Meta 详解 通过一个内嵌类 "class Meta" 给你的 model 定义元数据, 类似下面这样: class Foo(mode ...