re模块的基本使用
目录
re模块re模块,即正则表达式,本身是一种小型的、高度专业化的编程语言,它并不是Python的一部分 re模块的作用就是: 从大的字符串中挑选出 具有某种形状特点的字符串 常用元字符^ : 以..开头 s = 'abcdabc' res = re.findall('^ab',s) print(res) # ['ab'] $ : 以..结尾 s = 'abcdabc' res = re.findall('bc$',s) print(res) # ['bc'] . : 任意字符 s = 'abc红abc' res = re.findall('abc.',s) print(res) # ['abc红'] d : 数字 s = 'skld2342ljk' res = re.findall('d',s) print(res) # ['2','3','4','2'] D : 非数字 s = 'skld2342ljk' res = re.findall('D',s) print(res) # ['s','k','l','d','j','k'] w : 非空字符,即数字字母下划线 s = 'skld_2你3 42ljk' res = re.findall('w','_','2','你','k'] W : 空字符,包括空格 换行 s = 'skld_23 42ljk' res = re.findall('W',s) print(res) # [' '] s : 空字符,包括空格 换行 s = 'skld_23 42ljk' res = re.findall('s',s) print(res) # [' '] S : 非空字符,即数字字母下划线 s = 'skld_23 42ljk' res = re.findall('S','k'] + : 前面的一个字符至少1个 [1,正无穷) s = 'abcddabdabcdd abcd abc' print(re.findall('abcd+',s)) # ['abcdd','abcdd','abcd'] ?:前面的一个字符0-1个 前一个字符[0,1] 最大只有一个 s = 'abcddddd abcd abc ab' print(re.findall('abcd?',s)) # ['abcd','abcd','abc'] *** :前面的一个字符至少0个 前一个字符[0,正无穷)** s = 'abcddddd abcd abc ab' print(re.findall('abcd*',s)) # ['abcddddd','abc'] [] : 中括号内的都可以,但是只占一个位置 s = 'abc bbc cbc dbc abcd ' print(re.findall('[abc]bc',s)) # ['abc','bbc','cbc','abc'] [^] : 中括号的都不可以 s = 'abc bbc cbc dbc' print(re.findall('[^abc]bc',s)) # ['dbc'] |:或 满足就打印,一个或者两个三个 s = 'abc bbd dbc' print(re.findall('abc|bbc',s)) # ['abc'] {2}:前面的字符重复2个 s = 'abccabc abccc' print(re.findall('abc{2}',s)) # ['abcc','abcc'] {1,2}:前面的字符重复1-2个 区间是[1,2] s = 'abccabc abccc' print(re.findall('abc{1,2}','abc','abcc'] 特殊构造a(?=d) :a后面是数字,但是不要数字,不消耗字符串内容 s = 'a123 aaaa a234 abc' # a1 aa # aa # aa # a2 ab print(re.findall('a(?=d)',s)) # ['a','a'] print(re.findall('a(?=w)','a','a'] 贪婪模式Python里数量词默认是贪婪的,总是尝试匹配尽可能多的字符,一定要找到最后 才停止 **.(任意字符)*(0-无穷个)** s = 'abcdefgbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbg' print(re.findall('a.*g',s)) # ['abcdefgbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbg'] 非贪婪模式非贪婪的则相反,总是尝试匹配尽可能少的字符,找到一个就停止并返回 **.(任意字符)*(0-无穷个)?(让他进入非贪婪模式)** s = 'abcdefgbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbg' print(re.findall('a.*?g',s)) # ['abcdefg'] re的常用函数findall:最常用 推荐使用 直接在函数内部书写匹配规则 import re a = re.findall("匹配规则","这个字符串是否有匹配规则的字符") print(a) compile:写一个特定的规则模板 # 定义邮箱、手机号匹配规则,直接调用 email_pattern = re.compile('[email?protected]w+.com') phone_patter = re.compile('d{13}') print(re.findall(email_pattern,s)) match: 从字符串开头找一个,找得到就不找了 ;找不到报错 s = 'ab abcddd abc' res = re.match('abcd*',s) print(res.group()) search: 搜索,从整个内容中匹配,只找一个,找不到报错 s = 'ab abcddd abc' res = re.search('abcd*',s) print(res.group()) split 切割,相当于字符串的split s = 'ab23423abcddd234234abcasdfjlasjdk234l23lk4j2kl34kl25k3j2kl3j5lkj' print(re.split('d+',s)) # ['ab','abcddd','abcasdfjlasjdk','lk','kl','lkj'] sub 替换,相当于字符串的replace s = 'ab23423abcddd234234abcasdfjlasjdk234l23lk4j2kl34kl25k3j2kl3j5lkj' print(re.sub('d+',' ',s)) # ab abcddd abcasdfjlasjdk l lk j kl kl k j kl j lkj subn 替换,会返回替换的次数 s = 'ab23423abcddd234234abcasdfjlasjdk234l23lk4j2kl34kl25k3j2kl3j5lkj' print(re.subn('d+',s)) # ('ab abcddd abcasdfjlasjdk l lk j kl kl k j kl j lkj',12) re模块补充re.S 会让.匹配换行符 a = '''asdfhellopass: worldaf ''' b = re.findall('hello(.*?)world',a) c = re.findall('hello(.*?)world',a,re.S) print(b) # [] print(c) # ['pass:n '] . 不匹配换行 s = '''abc abcabc*abc ''' print(re.findall('abc.abc',s)) # ['abc*abc'] print(re.findall('abc.abc',s,re.S)) # ['abcnabc','abc*abc'] 分组 --> 只要括号里的(...) s = 'abc abcd abcdd' print(re.findall('a(.)c(d)',s)) # [('b','d'),('b','d')] 有名分组 s = 'abc abcd abcdd' print(re.search('a(?P<name>.)c(?P<name2>d)',s).groupdict()) # {'name': 'b','name2': 'd'} 关于re模块必须知道的知识点
非贪婪匹配
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |