Python随笔——正则表达式

一世执手 提交于 2019-12-11 04:55:14

正则表达式–随笔

一、什么是正则表达式

正则表达式(regular expression)是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑。
正则表达式有自己独立的操作处理引擎,可以匹配任何的编程语言。
我个人理解,正则表达式本质上是用于对字符串进行筛选的规则。但是如果系统自带的字符串能完成对应操作,尽量使用系统字符串提供的功能,因为它的处理效率比正则表达式要高!

二、使用正则表达式

Python提供的机制是存放再re模块下的。若要使用,则首先需要导入re模块
import re
接下来:
第一步:生成正则对象(指定匹配规则)
第二步:根据需要使用对应的匹配方法(放置待校验的字符串)
注:匹配方法有:match,search,findall,finder,split,sub,subn

match

当匹配规则(正则表达式)中没有设置^开头和\$结尾限制时,match的作用相当于验证待校验的字符串是否以正则表达式对应的字符串内容开头;	
当有设置^开头和\$结尾限制时,match的作用为检查待校验的字符串整体内容是否符合正则表达式中的内容。
匹配成功:返回Match对象,
匹配失败:返回None
#案例
import re
#生成正则对象(匹配规则)
re_obj = re.compile("hello")
#match匹配(待校验的字符串)
res = re_obj.match("hello KiKi,nice to meet you")
print(res)

re_obj2 = re.compile("^hello$")
res2 = re_obj2.match("HEllo KiKi,nice to meet you")
print(res2)

re_obj3 = re.compile("hello")
res3 = re_obj3.match("HEllo KiKi,nice to meet you")
print(res3)

执行结果如下:

<_sre.SRE_Match object; span=(0, 5), match='hello'>
None
None

search

在待校验的字符串中查找是否有满足正则表达式的字串;
如果有,返回匹配到的第一个字串对应的Match对象;没有,返回None
#案例
import re
re_obj = re.compile("to")
res = re_obj.search("nice to meet you,nice to meet you too")
print(res)

执行结果如下:

<_sre.SRE_Match object; span=(5, 7), match='to'>

findall

查找所有与规则匹配的对象,将匹配成功的子串存放再列表中然后返回。
import re
s = "i13love14you520"
#匹配所有正整数
re_obj = re.compile("[0-9]+")
res_list = re_obj.findall(s)
print(res_list)

执行结果如下:

['13', '14', '520']

finditer

查找所有与规则匹配的对象,将这些对象放在迭代器中。
import re
s = "i13love14you520"
#匹配所有正整数
re_obj = re.compile("[0-9]+")
res_iter = re_obj.finditer(s)
print(res_iter)
for ele in res_iter:
	print(ele)

执行结果如下:

<callable_iterator object at 0x000001E15FB87C88>
<_sre.SRE_Match object; span=(1, 3), match='13'>
<_sre.SRE_Match object; span=(7, 9), match='14'>
<_sre.SRE_Match object; span=(12, 15), match='520'>

split

在待切割的字符串中以正则表达式对应的内容为切割符,将匹配成功的子串放在列表中,最后返回一个列表。
import re
s = "i13love14you520"
#以非数字进行切割
re_obj = re.compile("[^0-9]+")
res_list = re_obj,split(s)
print(res_list)

#去除所有空字符串,得到仅有整数组成的子串
str_list = [ele for ele in res_list if ele!=""]
print(str_list)
#将所有子串以加号拼接
res_str = "+".join(str_list)
#借助eval函数自动的算出结果
print(f"{res_str}={eval(res_str)}")

执行结果如下:

['', '13', '14', '520']
['13', '14', '520']
13 + 14 + 520 = 547

sub

sub()执行的是替换操作
方式一:sub(新字串 , 待校验的字符串)
#案例
#将所有的1换成一
import re
s = "20190101"
re_obj = re.compile("1")
res = re_obj.sub("一",s)
print(res)
#20一90一0一
方式二:第一个参数接收一个函数
def func(match_obj):#形参用来接收查找到的内容对应的每一个Match对象
	return  替换后的新的子串
sub(func  ,s)
#案例:将所有数字都+1
import re
s = "猪场共有18900人"
def old_new(match_obj):
	print(match_obj)
	return str(int(match_obj.group())+1)#.group()用来获取Match对象里的值

re_obj = re.compile("[0-9]")
res = re_obj.sub(old_new,s)
print(res)

执行结果如下:

<_sre.SRE_Match object; span=(4, 5), match='1'>
<_sre.SRE_Match object; span=(5, 6), match='8'>
<_sre.SRE_Match object; span=(6, 7), match='9'>
<_sre.SRE_Match object; span=(7, 8), match='0'>
<_sre.SRE_Match object; span=(8, 9), match='0'>
猪场共有291011

subn

返回的是元组(替换之后的新字符串,替换的的次数)
import re
s = "猪场一共有180900人"
def old_new(match_obj):
	print(match_obj)
	return str(int(match_obj.group()) + 1)

re_obj = re.compile("[0-9]")
res = re_obj.subn(old_new,s)
print(res)

执行结果是:

<_sre.SRE_Match object; span=(5, 6), match='1'>
<_sre.SRE_Match object; span=(6, 7), match='8'>
<_sre.SRE_Match object; span=(7, 8), match='0'>
<_sre.SRE_Match object; span=(8, 9), match='9'>
<_sre.SRE_Match object; span=(9, 10), match='0'>
<_sre.SRE_Match object; span=(10, 11), match='0'>
('猪场一共有2911011人', 6)

三、正则表达式语法

1、匹配单个字符的语法

.(点)通配符
可以匹配除了\n之外的任意一个字符

import re
re_obj = re.compile(".")
res = re_obj.match("asd")
print(res)#<_sre.SRE_Match object; span=(0, 1), match='a'>
#需求,匹配点仅表示英文符号下的句号,不表示其他,我们可以加\
import re
re_obj = re.compile("\.")
res = re_obj.match(".")
res2 = re_obj.match("r")
print(res)#<_sre.SRE_Match object; span=(0, 1), match='.'>
print(res2)#None

2、区间匹配——列举

匹配区间内包含的任意一个 字符
[]区间用中括号表示
如果是连续的数据可以用横线连接
如果是非连续的,需要以一一列举出来
[0-9] 0-9中任意一个数字
[a-zA-Z]英文字符中的任意一个
[0-9a-zA-z_]数字字母下划线任意一个
[a-cmpk] abcmpk中的任意一个
[^abc]除了abc之外的任意一个字符
/]加减乘除
[a-z]
小写字母连续出现任意个
**注:在程序中\==\\
\d转义的话是用\\转义----》\\\\
为了保证\就是\ 所以会在字符串前面加r
建议 以后写正则表达式 加上r修饰

3、利用特殊符号表示任意一个字符

\d 表示0-9中任意一个字符[0-9]
\D [^0-9]表示以0-9中任意一个字符开头
\w 字母、数字、下划线和汉字中的任意一个
\W 非字母数字下划线、汉字中的任意一个
\s 表示任意空白字符中的一个
\S 非任意空白字符中的一个
#案例:用\d匹配\d
import re
re_obj = re.compile("..")
res = re_obj.match("\d")
print(res)
print(res.group())
re_obj2 = re.compile("\\"+res.group())
res2 = re_obj2.match("\d")
print(res2)

执行结果如下:

<_sre.SRE_Match object; span=(0, 2), match='\\d'>
\d
<_sre.SRE_Match object; span=(0, 2), match='\\d'>

4、正则语法的限制修饰

5、量词符号

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!