第43天python学习re模块学习

#之前可以进行对字符串进行完全匹配
#回顾:python中字符串是不可变对象,所以所有修改和生成字符串的操作的实现方法都是另一个内存片段中新生成一个字符串对象





import re
#re正则方法:是针对字符串进行模糊匹配操作的。正则表达式本身是一种小型的、高度专业化的编程语言,而在python中,通过内嵌集
# 成re模块,程序员们可以直接调用来实现正则匹配。正则表达式模式被编译成一系列的字节码,然后由用C编写的匹配引擎执行。
#使用场景:身份证,14亿人找到北京市90年的人
#1、元字符: .^ $ * + ? {} [] |()
#"."通配符,需要字符串里完全符合,匹配规则,就匹配,(规则里的.元字符)可以是任何一个字符,匹配任意除换行符" "外的字符(在DOTALL模式中也能匹配换行符)
# data=re.findall("g...d","sadajsgongdsa")#表示g开头中间为任意的三个字符,结尾为d的输出
# print(data)

#2、"^"尖叫符号:只能匹配开头的
# data=re.findall("^s...j","sadajsgongdsa")#^整个字符串开头必须是s,匹配的只能从开始匹配,需要一一对应(字符串位数一样),开始和结尾对于上
# print(data)#结果为:['sadaj']。

#3、“$”$符号需要匹配到结尾的
# data=re.findall("s...j$","sadajsgonjgdssdaj")#整个字符串结尾必须是j,需要一一对应(字符串位数一样),开始和结尾对于上
# print(data)#结果为:['sadaj']。

#4、当中间"."太多的时候处理方法:重复符号:* + ? {}

#重复符号:*匹配的是0到无穷次
# data=re.findall("s*","sadajsgonjgdssdaj")#*代表0到无穷次。
# print(data)#结果:['s', '', '', '', '', 's', '', '', '', '', '', '', 'ss', '', '', '', '']

#重复符号:+匹配的是1到无穷次
# data=re.findall("sdaj+","sadajsgonjgdssda")#*代表1到无穷次。
# print(data)#[]
#
# data=re.findall("sdaj*","sadajsgonjgdssda")#*代表0到无穷次。
# print(data)#['sda']

#重复符号:?匹配的是0到1次
# data=re.findall("sdaj?","sadajsgonjgdsda")#*代表0到1穷次。
# print(data)#['sda']

# “* +”贪婪匹配
# data=re.findall("sdaj*","sadajsgonjgdssdajjjj")#*代表0到无穷次。
# print(data)#['sdajjjj']

#转成不是贪婪匹配
# data=re.findall("sdaj*?","sadajsgonjgdssdajjjj")#*代表0到无穷次,但是?表示0到1,* ?同时取到最少0。
# print(data)#['sda']

#5、{}的作用包括了(* + ?)的用法
# data=re.findall("sdaj{6}","sadajsgonjgdsdajjjjjj")#*代表重复出现6个j。
# print(data)#['sdajjjjjj']
#
# data=re.findall("sdaj{0,6}","sadajsgonjgdsdajj")#*代表0到6的范围。
# print(data)#['sdajj']


#6、"[]"字符集:
# data=re.findall("x[y z]","xsjdaxyjjxz")#[]表示或的意思,只要有xy xz就输出
# print(data)#['xy', 'xz']

#"[]"字符集:里面没有特殊符号,有特殊意义的:"-"表示a-z "^"表示非 “”表示:可以把有功能的转换成没有功能 把无功能的变为有功能
# data=re.findall("x[y * z]","xsjdaxyyyjjxz")#[]表示或的意思,只要有xy xz就输出,虽然有*号但是㐊特殊符号y不会重复
# print(data)#['xy', 'xz']

# data=re.findall("x[a-z]","xsjxdaxyyyjjxz")#x开头第二位a-z都可以
# print(data)#['xs', 'xd', 'xy', 'xz']

# data=re.findall("x[^a-z]","xsjxdaxyyyjjx9")#表示:除了a-z以外的
# print(data)#['x9']



#7、“”可以把有功能的转换成没有功能 把无功能的变为有功能。本来d D s S等无功能的,只是一个字符,但是加""就有功能了

#d匹配任何十进制数,它相当于类[0-9],d+如果需要匹配一位或者多位数的数字时用

#D匹配任何非数字字符,它相当于类[^0-9]

#s匹配任何空白字符,它相当于类[ fv]

#S匹配任何非空白字符,它相当于类[^ fv]

#w匹配包括下划线在内任何字母数字字符,它相当于类[a-zA-Z0-9_]

#W匹配非任何字母数字字符包括下划线在内,它相当于类[^a-zA-Z0-9_]

# 匹配一个单词边界,也就是指单词和空格间的位置
# data=re.findall(r"I","I am  zhangshan")#表示:q前面加r的意思是,按照re的语法规则进行输出
# print(data)#['I']

# data=re.findall("I\b","I am zhangshan")#表示:使用pychram功能由于有功能的,但是前面加了一个表示转了在python无功能,再说还有re语法表示空格输出
# print(data)#['I']

data=re.findall(r"I\c","I\cjjj")#表示:I前面加r的意思是,按照re的语法规则进行输出
print(data)#['I\c']

data=re.findall("I\\c","I\cjjj")#表示:
print(data)#['I\c']
#8、“|”管道符:表示或的意思,“|”前面和后面内容进行单独匹配
# data=re.findall("Ia|c","Iacjjj")#表示:
# print(data)#['Ia', 'c']

#9、“()”括号:表示分组
# data=re.findall("(abc)+","abcabcabc")#表示:
# print(data)#

# data=re.search("abc","abcabcabc")#search只会找一个
# print(data)#<re.Match object; span=(0, 3), match='abc'>拿到一个对象
# print(data.group())#使用group进行直接取值

# data=re.search("(?P<name>[a-z]+)(?P<age>[0-9]+)","abc35abcabc")#search只会找一个
# print(data.group())#abc35
# print(data.group("name"))#直接取值字母部分:abc
# print(data.group("age"))#直接取值数字部分:35

#2、6个函数
import re
#findall:把返回的所有满足的结果放在列表里面['abc', 'abc', 'abc']
# data=re.findall("abc","1abcabcabc")
# print(data)

#search:扫描整个字符串并返回第一个成功的匹配。匹配成功re.search方法返回一个匹配的对象,否则返回Non。使用group取值
# data=re.search("abc","1abcabcabc")
# print(data)#<re.Match object; span=(0, 3), match='abc'>
# print(data.group())#使用group取值

#match和search一样,只是match是从开始匹配
# data=re.match("abc","abcabcabc")
# print(data)#<re.Match object; span=(0, 3), match='abc'>
# print(data.group())#使用ggroup取值

#无法匹配出结果
# data=re.match("abc","1abcabcabc")
# print(data)#<re.Match object; span=(0, 3), match='abc'>
# print(data.group())#使用ggroup取值

#split:字符串按某种方式分开
# data=re.split(" ","abc abc abc")#按空格方式分开
# print(data)#['abc', 'abc', 'abc']

# data=re.split("[ |]","abc a|bc abc")#把按空格 和 | 的都分开,使用字符集方式
# print(data)#['abc', 'a', 'bc', 'abc']

# data=re.split("[ab]","abc")#先按a分:左是:空 右侧:bc 按b分:把bc按b分,b的左侧是:空,右侧是:c
# print(data)#['', '', 'c']

#sub替换
# data=re.sub("abc","123","adcabcabc",1)#第一个参数:要替换的内容,第二个参数:替换的内容,第三参数:之前内容,第四个参数:替换的参数
# print(data)#adc123abc

#subn把内容替换,同时显示替换的参数
# data=re.subn("abc","123","adcabcabc")#第一个参数:要替换的内容,第二个参数:替换的内容,第三参数:之前内容
# print(data)#('adc123123', 2)

#compile:编译.。。可以多次使用,多次匹配其他内容
# data=re.compile("d+")#写规格,d匹配任何十进制数,它相当于类[0-9]
# print(data.findall("asdjsalfjla111"))
#
# data=re.compile("111")#写规格,x需要匹配“”111
# print(data.findall("asdjsalfjla111"))

#findite:拿到的是一个地址,使用next就能去对应的值
# data=re.finditer("d","asdhada123456")
# print(data)#拿到个地址<callable_iterator object at 0x02A40A30>
# print(next(data).group())#拿到第一个值
# print(next(data).group())#拿到第二个值

#补充findall
# data=re.findall("www.(baidu|qq).com","www.baidu.com")#点号前面使用把点号搞成普通字符
# print(data)#['baidu'],由于有()是优先级,所有只拿出来['baidu']

#括号里面加?:的作用:去除括号优先级
# data=re.findall("www.(?:baidu|qq).com","www.baidu.com")#点号前面使用把点号搞成普通字符。
# print(data)#['www.baidu.com']

# import re
# data=re.findall("(abc)+","abcabcabcabc")#由于有括号,优先处理,(abc)重复出现
# print(data)#['abc']
#
# data=re.findall("abc+","abcabcabcabc")#表示c可以重复多次
# print(data)#['abc', 'abc', 'abc', 'abc']
#
# data=re.findall("(?:abc)+","abc4abcabc1abc")#由于有括号,优先处理
# print(data)#['abc', 'abcabc', 'abc']
原文地址:https://www.cnblogs.com/jianchixuexu/p/11624282.html