re和正则表达式
正则表达式:正则表达式与re的关系 正则表达式是一门独立的技术,适用于任何语言 但在python‘中使用正则表达式将必须借助re模块 正则表达式就是一堆有语法的字符,用于匹配字符串中符合规则的内容 字符组:在同一位置可能出现的各种字符组成了一个字符组,在正则表达式中用[]表示 字符分很多种,比如数字,字母,标点等等。[ ]里面是或的关系
? ? ? ? ? ? ? ? 字符
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 量词
? ? ? ? ? ? ? ? ? 贪婪匹配与非贪婪匹配贪婪匹配就是尽可能匹配多个 注:正则表达式默认就是贪婪模式(尽可能匹配多的) 非贪婪匹配: 就是尽可能匹配少的,要想将贪婪模式改为非贪婪模式只需要在量词后面加?就可以将贪婪模式改为非贪婪模式 ? ? ? 转义符:在正则表达式中,有很多有特殊意义的元字符比如n和s,如果要正则中匹配正常的n就需要对进行转义,变成‘‘ 贪婪匹配:
? ? ? ? ? ? ? ? 常用的非贪婪匹配用法:*? ?重复任意次,但尽可能少重复 +?重复一次或更多次,但尽可能少重复 ??重复0次或1次,但尽可能少重复 {n,m}? ?重复n到m次,但尽可能少重复 {n,}? ?重复n到更多次,但尽可能少重复 ? .*?的用法:.是除换行符外任意字符 *是重复0次或多次 ?是非贪婪模式 合在一起就是取尽量少的任意字符,一般不会这么单独写,它大多用在:.*?x 就是取前面任意长度的字符,直到第一个x出现 re模块下的常用方法:import re 单个字符: re.I不区分大小写的匹配 print(re.findall(r‘a‘,‘abc123嘿嘿abcABC‘,flags=re.I)) # [‘a‘,‘a‘,‘A‘] a|b a或b单个字符 print(re.findall(r‘a|b‘,‘b‘,‘A‘,‘B‘] [a,b] a或,或b单个字符 print(re.findall(r‘[a,b]‘,‘abc,123嘿嘿abcABC‘,‘,‘B‘] [^ab]非a及非b的所有单个字符 print(re.findall(r‘[^ab]‘,123嘿嘿abcABC‘)) # [‘c‘,‘1‘,‘2‘,‘3‘,‘嘿‘,‘c‘,‘B‘,‘C‘] [a-z]所有单个小写字母 [A-Z]所有单个大写字母 [0-9]所有单个数字 print(re.findall(r‘[a-z]‘,123嘿嘿abcABC‘)) # [‘a‘,‘c‘] print(re.findall(r‘[0-9]‘,123嘿嘿abcABC‘)) # [‘1‘,‘3‘] 所有小写大写数字单个字符 print(re.findall(r‘[a-z]|[A-Z]|[0-9]‘,‘C‘] print(re.findall(r‘[A-Za-z0-9]‘,123嘿嘿[abcABC‘)) # [‘a‘,‘C‘] .会匹配除n以为的所有单个字符 print(re.findall(r‘.‘,‘*_+=n rt‘)) # [‘*‘,‘‘,‘_‘,‘+‘,‘=‘,‘ ‘,‘r‘,‘t‘] re.S会让.能匹配所有单个字符 print(re.findall(r‘.‘,‘*_+=n rt‘,flags=re.S)) # [‘*‘,‘n‘,‘t‘] # d单个数字 == [0-9] print(re.findall(r‘d‘,123嘿嘿[abcABC‘)) # [‘1‘,‘3‘] # w == [A-Za-z0-9_] 将常见的汉字就理解为单个字母 print(re.findall(r‘w‘,123嘿[_‘)) # [‘a‘,‘_‘] # s == [fnrtv ] 单个空:空格、制表符、换页符等 print(re.findall(r‘s‘,‘fnrtv ‘)) # [‘x0c‘,‘t‘,‘x0b‘,‘ ‘] D就是d的对立面:非数字的所有单个字符 W就是w的对立面 S就是s的对立面 print(re.findall(r‘D‘,‘[‘,‘_‘] 三个必须掌握的方法: findall:匹配目标字符串并返回所有符合正则表达式的内容 search:依据正则规则匹配到第一个就不匹配了并返回匹配到的对象,然后group()就可以拿到内容,如果没有就返回none,并且不能group获取 match:只会匹配字符串的开头部分,然后返回,group获取,当字符串中的开头部分不符合正则规则时会返回一个none,和上面一样,另外这个一般是用来进行校验的。 其他方法: ret = re.split(‘[ab]‘,‘abcd‘) # 先按‘a‘分割得到‘‘和‘bcd‘,在对‘‘和‘bcd‘分别按‘b‘分割 print(ret) # [‘‘,‘‘,‘cd‘] ret = re.sub(‘d‘,‘H‘,‘eva3egon4yuan4‘,1) # 将数字替换成‘H‘,参数1表示只替换1个 print(ret) # evaHegon4yuan4 ret = re.subn(‘d‘,‘eva3egon4yuan4‘) # 将数字替换成‘H‘,返回元组(替换的结果,替换了多少次) print(ret) obj = re.compile(‘d{3}‘) #将正则表达式编译成为一个 正则表达式对象,规则要匹配的是3个数字 ret = obj.search(‘abc123eeee‘) #正则表达式对象调用search,参数为待匹配的字符串 print(ret.group()) #结果 : 123 import re ret = re.finditer(‘d‘,‘ds3sy4784a‘) #finditer返回一个存放匹配结果的迭代器 print(ret) # <callable_iterator object at 0x10195f940> print(next(ret).group()) #查看第一个结果 print(next(ret).group()) #查看第二个结果 print([i.group() for i in ret]) #查看剩余的左右结果 分组优先机制 import re res = re.search(‘^[1-9]d{14}(d{2}[0-9x])?$‘,110105199812067023) print(res.group()) print(res.group(1)) # 获取正则表达式括号阔起来分组的内容 print(res.group(2)) # search与match均支持获取分组内容的操作 跟正则无关是python机制 # 而针对findall它没有group取值的方法,所以它默认就是分组优先获取的结果 ret = re.findall(‘www.(baidu|oldboy).com‘,‘www.oldboy.com‘) print(ret) # [‘oldboy‘] 这是因为findall会优先把匹配结果组里内容返回,如果想要匹配结果,取消权限即可 ret = re.findall(‘www.(?:baidu|oldboy).com‘,‘www.oldboy.com‘) # ?:取消分组优先 print(ret) # [‘www.oldboy.com‘] 其他 import re ret = re.search("<(?P<tag_name>w+)>w+</(?P=tag_name)>","<h1>hello</h1>") #还可以在分组中利用?<name>的形式给分组起名字 #获取的匹配结果可以直接用group(‘名字‘)拿到对应的值 print(ret.group(‘tag_name‘)) #结果 :h1 print(ret.group()) #结果 :<h1>hello</h1> """ 注意?P=tag_name相当于引用之前正则表达式,并且匹配到的值必须和前面的正则表达式一模一样 """ # 匹配整数 ret=re.findall(r"d+","1-2*(60+(-40.35/5)-(-4*3))") print(ret) #[‘1‘,‘60‘,‘40‘,‘35‘,‘5‘,‘4‘,‘3‘] ret=re.findall(r"d+.d*|(d+)",‘3‘] ret.remove("") print(ret) #[‘1‘,‘3‘] (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |