#__author:86188
#date: 2020/7/20
import re
#字符串
s=' w e r '
x=s.split() #这个开头和结尾的空格不打印
#x=s.split(' ')
print(x)
s='hello world'
#找到所有匹配的内容放到一个列表里,前面的是匹配规则,后面的是匹配对象
print(re.findall("wr",'hello world'))
#元字符
#.通配符 .
#^ 开始阶段匹配
#$ 结尾匹配
#重点 *,+,?,{}都是描述前面一个字母或符号的,修饰功能 *={0,+00} +={1,+oo} ?={0,1} 表示正无穷的方法就是不加,但是要注意逗号
#参见word
print(re.findall("^h...",'hello world'))
#注意 列表中会出现'' , *号的特殊之处 ,两种可能
print(re.findall("",'hello world'))
print(re.findall('e*','hello world')) #实际上等价于两种 情况,1是'',而是'eeeeee。。'e是任意多个
print(re.findall(".*",'hello world'))
print(re.findall("el*",'hello woreld')) #单个字符只会被匹配一次。不会出现匹配'ell'出现三个结果'e' 'ell' 'el'
#
#{}
print(re.findall("l{2}",'hello woreld'))
print(re.findall("l{1,3}",'hello woreld'))
#字符集
# [] 里面只匹配一个字符,多选一 取消元字符的特殊功能(\ ^ - 例外)
# [a,*] 这表示字符 'a' '*' ',' 也就是说不需要加','
print(re.findall("e[l,l]",'hel,lo wore,ld'))
print(re.findall("[a-z]",'hello woreld')) #['h', 'e', 'l', 'l', 'o', 'w', 'o', 'r', 'e', 'l', 'd']
#[^] 取反 表示非't'、非'l',但是规则表示的也是一个字符
print(re.findall("[^tl]",'hel,lo woret,ld')) #
#\
#反斜杠跟元字符去除特殊功能
#反斜杠跟普通字符实现特殊功能
#*********
#\d 匹配数字0-9,相当于[0-9]
#\D 匹配任何非数字字符,相当于[^0-9]
#\s 匹配任何空白字符,相当于[\t\n\r\f\v]
#\S 匹配任何非空白字符,相当于[^\t\n\r\f\v]
#\w 匹配任何字母数字字符,相当于[0-9a-zA-Z]
#\W 匹配任何非字母数字字符,相当于[^0-9a-zA-Z]
#\b 匹配一个特殊字符
#**********先python对规则进行解释,两个'\' 变一个,然后传给re模块,可能re也需要转义,因此思考时进行逆向思维,
# 1.先确定python中需要匹配的字符串内容,如'\n' 代表着'\\n"
# 2.从re开始
#
#print(re.findall("[d\n]",'hel,lo wo\\bret,\\d\\\\b\nl\bd\n')) #
# print(re.findall("[ln]",'hel,lo woret,l\nd')) #
# print(re.findall("[l\a{]",r'heal\\\,l\o wo\ret,l\{\\nd'))#匹配'l'或'\\'
# print(re.findall("[l\\.]",'hel,lo wo.ret,l\\nd')) # 匹配‘l' 或’.'
#
# print(re.findall("I\\\\b",'hello,I\\b am \\ba lIbst')) #注意
# print(re.findall("\\nb",'hello,I\\b am \d\ba \nblI\\nbst')) #注意
# #找到第一个符合规则的内容,search 匹配成功返回结果是一个对象只返回第一个匹配的结果,若没有匹配则是None对象,调用grouph会报错
x=re.search(r"\bs","sdfw\dg(s(\b\\n")
print('======')
print(x.group())
#print('\b')
# x=re.search("a\.","sdsfwgsbn")
#()表示可以匹配多个组的内容,至少一个组,
x=re.search("(as)+","assdfw\dg(assaass(\b\\n") # asas
print(x.group())
#|匹配两者都可以
x=re.search("(as)|3","3asasdfw\dg(assasass(\b\\n")
print(x.group())
#文件路径的匹配 命名分组匹配的固定格式
ret=re.search("(?P<id>\d{3})/(?P<name>\w{3})","weeeew34ttt123/ooo")#
#ret=re.search("www.(\w+).com","www.baidu.com")# 这里只会把分组的内容取出来,输出'baidu'
print(ret) #写成(?:\w+)表示取消优先级
print(ret.group())
print(ret.group('id'))
print(ret.group('name'))
# 123/ooo
# 123
# ooo
#match 只能匹配在开头的第一个内容,比search多了一个开头限制
ret=re.match("asd","adfga asd ")
# print(ret)
# print(ret.group())
#re.split() 先对’j'分割,然后对'sd'和'k,sal'进行按's'分割 #也可以理解从前往后一次对's','j'进行分割
ret=re.split("[j,s]","sjk,sal")#['', '', 'k', '', 'al']
print(ret)
#re.sub('规则','替换的内容','字符串')
ret=re.sub("a..x","s..b","ealexsdx",1) #替换次数
ret=re.subn("a..x","s..b","ealexsdx") #编程元组了,多了一个数字
s='wert'
s=s.replace('r','s')
print(s)
print(ret)
#***********re.comple() 将规则编译成一个对象
obj=re.compile("\.com")
ret=obj.findall("www.baidu.com")
print(ret)
obj.findall("")
#计算器 匹配到最里层括号 注意前面的*,+,? 都是贪婪匹配 后面加个?就是惰性匹配
#re.search("\([^()]+\)")
print(re.findall("[.*+]","a.sd+")) #此时.,*,+都是普通字符
#迭代器 想取来取元素加group()
ret=re.finditer("\d",'ds2sy4784a')
print(next(ret))
print(next(ret).group())