re模块:
import re
正则表达式本身具有处理字符串的能力
如果要处理的字符串存在python的内存里,模块--->操作正则表达式
ret= re.findall("\d+","kdk334k5kjkj76k54j5kk")
print(ret)
一次性返回所有匹配到的项,直接存到列表中.
findall 和分组()的问题
import re
ret = re.findall("\d+(?:\.\d+)?","1.32+4.78")
print(ret)
?: 表示取消优先(分组), ?: 写在一个分组的最开始,表示在findall方法取消这个分组优先级.
下面的例子:
ret=re.findall(r"\d+\.\d+|(\d+)","1-2*(60+(-40.35/5)-(-4*3))")
while '' in ret: ret.remove('') print(ret)注意:!!!:这里例子中的匹配顺序是:依照正则表达式,匹配内容,先匹配\d+\.\d+ 符合就返回这个值,不符合返回 "" 空字符串,然后在匹配(\d+),符合就返回这个值,不符合返回 "" 空字符串,因为 () 具有优先顺序,所以优先显是的是跟 () 匹配出来的结果
记住!!!在用findall这个方法的时候如果没有取消()的优先顺序的话,就会把正则表达式分成几个部分,分成几个部分就会匹配几个结果,最后返回的是括号()里的.因为()在findall方法里具有优先顺序.如果分开的几部分里正则表达式有重复的只会从左到右依次开始匹配,匹配第一个正则表达式,匹配成功后,后面的表达式没有匹配,最后只会 返回 "" 空字符.
ret = re.search("\d+","kkf33kj3kjkd34k4j45kjkjfj")
print(ret) #正则匹配结果的对象
if ret:
print(ret.group())
一次只匹配第一个符合条件表达式,以对像的形式返回,通过对对象.group()取实际值,如果没有匹配到,会返回None 再调用group则会报错.
findall:匹配所有符合条件的 返回一个列表
search:只匹配第一个符合条件的 有值返回值,没有值返回None
ret = re.split("(\d+)","adk34ldjkf432jkjdj343llke")
print(ret)
split中如果带有分组,会在分组的同时保留被分割内容,如果没有有分组则不会保留被分割内容 ?""也能不保留被分割内容.
ret = re.sub("\d+","sb","alex83wusir34egon43",4(替换次数,可设置))
print(ret) #替换,同replace一样.
ret = re.subn("\d+","sb","alex83wusir34egon32",4(可设置))
print(ret) #比sub显示的结果多了替换的次数.
compile节省时间:
obj = re.compile("\d+") #将正则表达式编译成为一个正则表达式对象.
print(obj)
ret = obj.search("abc12kdk33djfj")#正则表达式对象调用search,参数为待匹配的字符串
print(ret.group())
finditer 具有迭代功能,节省空间.
ret = re.finditer("\d+","34kfj55j4kkf43fjk")
print(ret)
for i in ret:
print(i.group())
总结:
基础查找: findall(分组优先显示) search match
替换分割: split(分组保留) sub subn
代码优化: compile finditer
分组命名:
html标签语言
html是一种代码
对于浏览器来说,浏览器和代码之间有一种约定.
写在一个标识符之内的代码可以有一种独立的格式.
标识符: 例 <h1>fjdladjkfei</h1>
给分组起名字(?P<tag>正则表达式),使用分组的名字(?P=tag)
ret = re.search("<(?P<tag>\w+?)>\w+</(?P=tag)>","<b>hello</b>")
print(ret.group())
print(ret.group(tag))
根据分组的索引使用分组\1,1是分组的索引值.
ret=re.search(r"<(\w+?)>\w+</\1>","<b>hello</b>")
print(ret.group())
print(ret.group(1))
ret = re.finditer(r"<(\w+?)>\w+</\1>","<b>kdjajfkd</b>")
for i in ret:
print(i.group(1))
print(i.group())