正则表达式

正则表达式可以用于模糊匹配,找东西。

import re
re.findall("yishu","gasghether")
十几个元字符,六个匹配
. 通配符 可以代替任意一个字符,除了/n
r = re.findall("y..u","gasyghuether")
print(r)
^ 以什么开头
r =re.findall("g..y","gasyghuyther")
print(r)
['gasy', 'ghuy']
r =re.findall("^g..y","gasyghuyther")
print(r)
['gasy']
$ 以什么结尾
r= re.findall("t..r$", "gasyghuyther")
['ther']
重复功能 * 匹配离它最近的字符0到无穷次 0次也匹配的上
r = re.findall("d*","fdsgafgfdddddfdfgdg")
print(r) #['', 'd', '', '', '', '', '', '', 'ddddd', '', 'd', '', '', 'd', '', '']
+ 匹配1到无穷次
r = re.findall("d+","fdsgafgfdddddfdfgdg")
print(r) #['d', 'ddddd', 'd', 'd']
?(0,1) 匹配一次或者0次,只有这2个可能
r= re.findall("fd?","fdsgafgfdddddfdfgdg")
print(r)
{}  {0,} == *  {1,} == +  {0,1} == ?  {6} 重复6次  {1,6} 1到6次

上面的都是贪婪匹配,后面加?变成惰性匹配 按照贪婪匹配的最小的匹配
[] 字符集
r= re.findall("www[oldboy baidu]","wwwbaidu")
print(r)
r = re.findall('q[x*b]',"sssferqghgh")  #除了q之外,中括号中必须最少有一个匹配得上。
print(r)  #[]
r = re.findall('q[x*a]',"dfdq*fdg")  # 括号中,除了 /, -, ^,其余均被视为普通字符
print(r)  #['q*']
r= re.findall("q[a-z]","dsafqafdsaqb")  #a-z表示为a-z中所有的都可以进行匹配
print(r)  #['qa', 'qb']
r= re.findall("q[a-z]*","dsafqafdsaqb")
print(r)  #['qafdsaqb']
r = re.findall("q[^a-z]", "q1224")
print(r)  #['q1']
r = re.findall("q[^a-z]", "qfs")
print(r)   #[]
例子  如何运算出12 +(34 * 6 +3 -9 +(2 +4)) 那么首先肯定运算最里面括号的
r = re.findall("\([^ ( ) ]*\)","12 +(34 * 6 +3 -9 +(2 +4))")  #[^()]* 没有括号重复n次
print(r)   #['(2 +4)']
\d \D \s  \S  \w  \W  \b
r =re.findall("www\.baidu","www.baidu")  #.本来是代替任何字符,加\让.没意义
print(r)
print(re.findall('gad{1,5}','gafsdrgadgadddddrtgrh'))

print(re.findall( r"I\b","ave I fgdgI"))   #r是raw string 表示\b是原生字符串,不需要python解释器翻译
print(re.findall("I\\b","dsf I fsdfI"))    #再加个\也是同样的意思,\把\b的特殊意义取消掉
print(re.findall('c\\\\s',"fdsc\sfds"))   #c\\\\s中,\在python解释器有含义,前面2个\\转义\成符号,后面\\是把字符的\转义成符号
print(re.findall(r"(abc)+","abcabcabcabc"))   #['abc']
print(re.search("(?P<name>\w+)","abcccc").group())  #findall找完所有的,search是只要找到有一个满足的,就不往下找
print(re.search("(?P<name>[a-z]+)(?P<age>\d+)","yishu27jessic24").group("age"))   #27 (?P<str>)固定搭配,分组用的

re 的方法
findall  把所有的匹配到的信息放到一个列表中
search.group()  找到的第一个提出来,看信息用group,得到匹配的字符串
match。group()  返回对象,group调取,相当于从第一个开始匹配,只匹配开始的位置
print(re.split(" ","hello abc def"))
print(re.split("[ |]","asdfd fsa|saf"))
print(re.split("[ab]","asdabcd")) #按照a或者b分一次,a分完b也要分  #result = ['', 'sd', '', 'cd']  a的左边没内容 就是空''
print(re.sub("\d+","A","2312gfgf34fdsgs"))  #替换字符串 结果:AgfgfAfdsgs
print(re.subn("\d","A","321gfreg342"))  #('AAAgfregAAA', 6)  替换了6次
comp = re.compile("\d+")  #comp是一个规则
print(comp.findall("432gsd"))  #用规则去找 规则可以用多次,增加效率
ret = re.finditer() 返回的是一个迭代器
next(ret).group()  next(ret)是一个对象,取出结果用group
print(re.findall('www\.(baidu|134)\.com', "www.baidu.com"))  # ['baidu'] findall优先匹配分组括号内的内容
print(re.findall("www\.(?:baidu)\.com","www.baidu.com"))  #?:在括号内是去优先级  结果:['www.baidu.com']
总结
print(re.search("a(bc)|(ty)d","tyd").group())  |或匹配|两边
re.findall("(abc)+", "abcabc")
#输出 abc  ()是分组,findall优先匹配组里面的信息,也就是匹配abc,组里面只有一个abc,输出一个
re.findall("(?:abc)+", "abcabc")
#输出abcabc  #去掉了adc的优先级



阅读更多
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页