正则表达式中的转义符在python的字符串中也恰好有转移的做用,可是正则表达式中的转义符和字符串中的转义符并不要紧,且还容易有冲突。
为了不这种冲突,咱们全部的正则都以在工具中的测试结果为结果,而后只须要在正则和待匹配的字符串外面都加r便可python
print('\\\\n') # \\n print('\\n') # \n print(r'\\n') # \\n print(r'\n') # \n
findall 会匹配字符串中全部符合规则的项,并返回一个列表,若是未匹配到,则返回空列表。正则表达式
import re ret = re.findall('\d+','alex83') print(ret)
search 会从头至尾从带匹配匹配字符串中取出第一个符合条件的项,若是匹配到了,返回一个对象,用group取值;若是没匹配到,返回None,不能用group取值。工具
import re ret = re.search('\d+','alex83') print(ret) # 若是能匹配上返回一个对象,若是不能匹配上返回None if ret: print(ret.group()) # 若是是对象,那么这个对象内部实现了group,因此能够取值 # 若是是None,那么这个对象不可能实现了group方法,因此报错
match 会从头匹配字符串中取出从第一个字符开始是否符合规则,若是符合,就返回对象,用group取值;若是不符合,就返回None.测试
match = search + ^正则code
import re ret = re.match('\d','alex83') == re.match('^\d','alex83') print(ret)
1.时间复杂度 效率 compile对象
在同一个正则表达式重复使用屡次的时候使用可以减小时间的开销内存
2.空间复杂度 内存占用率 finditerrem
在查询的结果超过1个的状况下,可以有效的节省内存,下降空间复杂度,从而也下降了时间复杂度字符串
3.用户体验it
import re ret = re.findall('\d','safhl02urhefy023908'*20000000) # 时间复杂度、空间复杂度都很是高 print(ret) ret = re.finditer('\d','safhl02urhefy023908'*20000000) # ret是迭代器 for i in ret: # 迭代出来的每一项都是一个对象 print(i.group()) # 经过group取值便可
import re ret = re.compile('\d3') # 先配置好正则 print(ret) r1 = ret.search('alex83') # 能够直接调用 print(r1) ret.findall('wusir74') ret = re.compile('\d+') r3 = ret.finditer('taibai40') for i in r3: print(i.group()) \d 正则表达式 ——> 字符串 \d str 循环str,找到全部的数字
import re ret = re.split('\d+','alex83wusir74taibai') print(ret) # ['alex', 'wusir', 'taibai'] ret = re.split('\d(\d)','alex83wusir74taibai') # 默认自动保留分组中的内容(被切割掉的内容) print(ret) # ['alex', '3', 'wusir', '4', 'taibai']
import re ret = re.sub('\d','D','alex83wusir74taibai',1) print(ret) # alexD3wusir74taibai ret = re.sub('\d','D','alex83wusir74taibai',3) # 3表示替换掉几个 print(ret) # alexDDwusirD4taibai ret = re.subn('\d','D','alex83wusir74taibai') # subn 直接所有替换的 print(ret) # ('alexDDwusirDDtaibai', 4) # 获得一个元组,并把一共替换掉几个做为元组的一个元素
s1 = '<h1>wahaha</h1>' s2 = '<a>wahaha ya wahaha</a>' # s1 -> h1 wahaha # s2 -> a wahaha ya wahaha import re # 方法一 ret = re.search('<(\w+)>(.*?)</\w+>',s1) print(ret) print(ret.group(0)) # group参数默认为0 表示取整个正则匹配的结果 print(ret.group(1)) # 取第一个分组中的内容 print(ret.group(2)) # 取第二个分组中的内容 # 方法二(分组命名) ret = re.search('<(?P<tag>\w+)>(?P<cont>.*?)</\w+>',s1) print(ret) print(ret.group('tag')) # 取tag分组中的内容 print(ret.group('cont')) # 取cont分组中的内容
分组命名:
(?P <名字> 正则表达式)
引用分组 (?P=组名) 这个组中的内容必须彻底和以前已经存在的组匹配到的内容如出一辙
s1 = '<h1>wahaha</h1>' s2 = '<a>wahaha ya wahaha</a>' ret = re.search('<(?P<tag>\w+)>.*?</(?P=tag)>',s1) # 用于约束先后<>内的内容一致 print(ret.group('tag')) # h1 # \1:转义1,表示分组中的 s1 = '<h1>wahaha</h1>' s2 = '<a>wahaha ya wahaha</a>' ret = re.search(r'<(\w+)>.*?</\1>',s1) print(ret.group(1)) # h1
findall 遇到分组
findall 遇到正则表达式中的分组,会优先显示分组中的内容
import re ret = re.findall('\d(\d)','aa1alex83') # findall遇到正则表达式中的分组,会优先显示分组中的内容 print(ret) ret = re.findall('\d+(?:\.\d+)?','1.234+2') # ?: 取消分组优先显示 print(ret)
分组和 findall
# 例题 # 有的时候咱们想匹配的内容包含在不相匹配的内容当中,这个时候只须要把不想匹配的先匹配出来,再经过手段去掉 import re ret=re.findall(r"\d+\.\d+|(\d+)","1-2*(60+(-40.35/5)-(-4*3))") print(ret) ret.remove('') print(ret)
split 遇到分组:会保留分组中原本应该被切割掉的内容
def func(): print(123) n = yield 'aaa' print('-->',n) yield 'bbb' g = func() print(g) n = next(g) print(n) print('-'*20) next(g) # g.send('uysdfhfoiusyg')与next(g)的做用同样
正则 ?都能作什么?