// Fork me on GitHub

正则

#__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())

 

posted @ 2020-10-13 13:50  繁星春水  阅读(171)  评论(0)    收藏  举报
1 //2 3
//4