python 正则表达式详解

萝らか妹 提交于 2019-12-19 05:40:19

1.正则表达式简介

	正则表达式英文名称 regular expression 它是一个 特殊的字符串 用于校验其他的字符串中满足我们需求的部分

	正则表达式有自己独立的操作处理引擎, 所以他可以匹配任意编程语言

	如果本身系统字符串能完成的操作 尽量使用系统字符串提供的功能 因为处理效率要比正则表达式快

	正则表达式 Python提供的机制是存放在re模块下

2正则表达式常用的语法

正则表达式的语法

'''
匹配单个字符的语法	
'''
	1.  .(点)  通配符 
		匹配除了\n之外的任意一个字符
			需求 这个点仅表示英文符号下的句号 不表示其他符号
				\. --- 需要转义符
	2.区间匹配 -- 列举
		匹配区间内包含的任意一个字符
		[]区间是用中括号表示的
			如果是连续的数据可以用横线进行连接 如果是非连续的需要一一列举出来
		[0-9] --- 0-9中任意一个数字
		[a-zA-Z] --- 英文字符中的任意一个
		[0-9a-zA-Z_] --- 数字 字母 下划线中的任意一个
		[a-cmpk] -- abcmpk中的任意一个
		
		[^abc]
			除了abc之外的任意一个字符
		
		[+\-*/]
			加减乘除
		[a-z]* --- 小写字母连续出现任意个 
	3.特殊的符号来表示任意一个字符
		\d --- 表示的是0-9中任意一个字符
				[0-9]
		\D --- [^0-9]
		\w --- 数字字母下划线和汉字中的任意一个
		\W --- 非数字字母下划线和汉字中的任意一个
		\s ---- 表示的是任意空白字符中的一个
		\S ----非任意空白字符中的一个
	4.正则语法的限制修饰
		边界匹配
			^x --- 表示以x开头
			x$ --- 表示的是以x结尾
			\Ax --- 以x开头
			x\Z --- 以x结尾
					视作多行的模式下 会有区别
						^ -- 匹配的是每一行的行首
						\A -- 匹配字符串的开头
						
						$-- 匹配的是每一行的行尾
						\Z -- 匹配字符串的结尾
						
			\b --- 单词的边界
			\B --- 单词非边界
		正则表达式匹配模式
			compile(正则表达式, 匹配模式)
				re.I --- 忽略大小写的情况下进行匹配
				re.M ---- 将数据视作多行进行匹配
				re.S --- 将内容视作一行进行匹配
							在这种模式下 .可以匹配\n
	5.量词符号
		x* --- 表示x连续出现任意次 [可有可无]
		x+ --- 表示x连续出现至少1次
		x? ---- 表示x最多出现1次
		
		x{m,n}
			表示x最少连续出现m次 最多连续出现n次
		x{m,}
			表示x最少连续出现m次
		x{m}
			表示x必须连续出现m次
			
		+ * 贪婪匹配
		限制贪婪
			+?   *?
	6.匹配一组符号
		com net cn  qq
		使用小括号包含一组数据
			(组内的数据)
			| --- 表示的是或者的意思
			(数据1|数据2|数据3)
				在数据1 数据2 数据3中任选其一
			
			\num模式
				后面匹配出的内容与前面某组匹配出的内容一模一样  就可以使用\num模式  num为数值看与哪个小组内容匹配 num就是几 (从1开始的)
				<([a-zA-Z]+)> </\1>

3.正则表达式常用的方法

正则表达式常用的方法:

1.将正则表达式的语法生成对应的正则对象
	正则对象 = compile(正则表达式语法)
2.match(待校验的字符串)
	如果正则表达式中没有设置^开头和$结尾限制这种操作 match的作用类似于验证待校验字符串是否以正则表达式对应的字符串内容开头
	如果正则表达式中设置了^开头和$结尾限制这种操作 match的作用检查待校验的字符串的整体内容是否符合正则表达式的语法
	如果满足要求的 返回的Match对象  否则返回None
import re

#1.生成一个对应的正则对象
re_obj = re.compile("hello")
#match验证
res = re_obj.match("Hello good good study")
print(res)

#1.生成一个对应的正则对象
'''
正则表达式的语法:
    ^x --- 这个字符串以x开头
    x$ --- 这个字符串以x结尾
'''
re_obj = re.compile("^hello$")
#match验证
res = re_obj.match("hello")
print(res)
3.search(待查询的字符串)
	在待查询的字符串中查找是否有满足正则表达式的子串 如果有返回查找到的第一个子串对应的匹配Match对象
	如果没有返回None
import re

#1.生成一个对应的正则对象
re_obj = re.compile("to")

res = re_obj.search("nice to meet you hello nice to meet you too")

print(res)
#在匹配对象中有span  包含的是查询到的子串的区间 前闭后开
pos = res.span()
print(pos)

#获取匹配到的内容
content = res.group()
print(content)


#findall
'''
[0-9]
    表示取0-9中的任意一个字符
x+
    +数量词  表示x至少连续出现1次
[0-9]+
    表示连续出现的数字
'''
4.findall(待查询的字符串)
	在待查询的字符串中查找是否有满足正则表达式的子串 将其放在列表中
# s = "i13love14you520"
# re_obj = re.compile("[0-9]+")
# res = re_obj.findall(s)
# print(f"{'+'.join(res)} = {eval('+'.join(res))}")
5.finditer(待查询的字符串)
	在待查询的字符串中查找是否有满足正则表达式的子串 将检验到的数据对应的Match对象放在迭代器中
s = "i13love14you520"
re_obj = re.compile("[0-9]+")
res_iter = re_obj.finditer(s)
# print(res_iter)

# for ele in res_iter:
#     print(ele)
'''
<_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'>
'''
num_list = [ele.group() for ele in res_iter]
print(num_list)
str_res = " + ".join(num_list)
print(f"{str_res} = {eval(str_res)}")
6.split(待切割的字符串)
	在待切割的字符串中以正则表达式对应的内容为切割符 对字符串进行切割
import re

s = "i13love14you520hi"

#以非数字进行切割
'''
[^0-9]除了数字之外的任意一个字符
'''
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)
print(f"{res_str} = {eval(res_str)}")
7.sub(新子串,待查找的字符串)
	替换的操作
s = "python1910"

#操作是将1替换成一
replace_str = s.replace("1", "一").replace("9","九").replace("0", "零")
print(replace_str)

import re

re_obj = re.compile("1")
res = re_obj.sub("一", s)
print(res)

'''
sub还有另外一种方法
    第一个参数可以接受一个函数
    函数有一个形参
        接受的查找到的内容对应的每一个Match对象
    函数有返回值
        返回值替换的新的子串
'''
s = "Python1910 共有18人"
def old_new(match_obj):
    print(match_obj)
    return str(int(match_obj.group()) + 1)

re_obj = re.compile("[0-9]")
res = re_obj.sub(old_new, s)
print(res)
8.subn
	返回的是元组
		(替换之后的新字符串, 替换的次数)
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!