正则表达式可以用于模糊匹配,找东西。
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的优先级