四、python学习-正则表达式

正则表达式 import re lst = re.findall(正则表达式,需要匹配的字符串) findall 把所有匹配到的字符串都搜出来,返回列表 不能把分组内容和匹配内容同时显示出来 search 只把搜索到一个结果就返回,返回对象 可以把分组内容和匹配的内容同时显示出来 group 对象.group() 直接获取匹配到的内容 groups 对象.groups() 直接获取分组里边的内容 1.预定义字符集

str = "caca/#%*!~cac'cac123"

.匹配任意字符,除了换行符\n

\d 匹配数字

\D 匹配非数字

\w 匹配字母 数字 下划线(正则函数中,支持中文的匹配)

\W 匹配非字符 数字 下划线

\s 匹配任意的空白符:、n \t \r " " ' '

\S 匹配非任意的空白符

\n 匹配换行符:re.findall(r"\n",str)

\t 匹配空格:re.findall(r"\t",str)

[] 匹配[]中列举的字符(^在字符组中,代表除了)

lst = re.findall("[abc]","jnjnnjnunun")=>None re.finadll("a[abc]c","aac abb")=>aac re.findall("a[0-9]b","a1b acb")=>a1b re.findall("a[a-g]b","a1b acb")=>acb re.findall("a[A-G]b","a1b acb aCb aYb")=>aCb re.findall("a[0-9a-zA-z]b","a-b a1b aYb aqbalb")=>a1b aYb aqb alb re.finadll("a[0-9][*#/]b","a1/b a2b a29b a56b")=>a1/b # ^在字符组中,代表除了 re.findall('a[^-+*/]','a%b ccaa*bda&bd')=>a%b a&b # 如果想要匹配^ 或者 -,在原来的字符加上\ re.findall(r'e[\^\-]f',"e^f e-f")=>e^F e-f re.findall(r'a\\n','a\n')=>a\n 2.多个字符匹配

量词在那个字符后面就是谁的量词

? 匹配0个或者1个字符

+ 匹配1个或者多个

* 匹配0个或者多个

{m,n} 匹配m到n字符

import re # 1<=x<=2 re.findall('a{1,3}b','aaab ab aab abbb aaz aabb')=>aaab ab aab ab aab # x=2 前面修饰的a必须是两个字符 re.findall('a{2}b','aaab ab aab abbb aaz aabb')=>aab aab aab # x>=2 至少是两个字符 re.findall('a{2,}b','aaab ab aab abbb aaz aabb')=>aaab aab aab 3.贪婪模式 与 非贪婪模式 贪婪模式 与 非贪婪模式: 贪婪模式:默认向更多次匹配,底层用的是回溯算法 非贪婪模式:默认向更少次匹配,用一个?来进行修饰(修饰在两次的身后) 回溯算法:从左向右进行匹配,一直到最后,直接最后再也匹配不到了,回头,寻找最后一个 strvar = "张三李四王五张四张五子acaca子443232" re.findall("张.",strvar)=>张三 张四 张五 # 贪婪模式 re.findall("张.?",strvar)=>张三 张四 张五 re.findall("张.+",strvar)=>张三李四王五张四张五子acaca子443232 re.findall("张.*",strvar)=>张三李四王五张四张五子acaca子443232 re.findall("张.{1,21}",strvar)=>张三李四王五张四张五子acaca子443232 re.findall("张.*子",strvar)=>张三李四王五张四张五子acaca子 # 非贪婪模式 re.findall("张.??",strvar)=>张 张 张 re.findall("张.+?",strvar)=>张三 张四 张五 re.findall("张.*",strvar)=>张 张 张 re.findall("张.{1,21}?",strvar)=>张三 张四 张五 re.findall("张.*?子",strvar)=>张三李四王五张四张五子 4.边界符 # \b backspace 本身就是一个转义字符 边界符 卡单词word 卡住左边界 \bw 卡住右边界 d\b import re strvar = "word pwd scf" re.findall(r".*d\b",strvar) 'word pwd' re.findall(r".*?d\b",strvar) word,pwd re.findall(r"\bw",strvar) 'w' re.findall(r"\bw.*?",strvar) 'w' # 正则表达式中写字符时,要谨慎,下面例子必须匹配到第一个空格时,才结束 re.findall(r"\bw.*? ",strvar) 'word ' re.findall(r"\bw\S",strvar) 'wo' re.findall(r"\bw\S*",strvar) 'word'

^ 、 $

^ 必须以...开头 $ 必须以...结尾 如果出现了^ $,要把这个字符串看成一个整体 5.正则表达式-分组

正常分组

import re strvar = "wu_good alex_good secret_good" # 1.分组练习 re.findall('.*?_good',strvar) =>"wu_good" "alex_good" "secret_good" # () 显示括号里边匹配到的内容 re.findall('(.*?)_good',strvar) =>"wu" "alex" "secret" # ?: 不显示括号里边的内容 re.findall('(?:.*?)_good',strvar) =>"wu_good" "alex_good" "secret_good" # 2. | 代表或,a|b代表 a 或 b strvar = "abcddd" re.findall("a|b",strvar) => a,b # 注意事项:为啦避免优先匹配前面的字符串,导致字符串匹配不完整,把较难匹配到的字符串写在前面,容易匹配到的字符串放在后边 # 匹配abc 或者abcd strvar = "abc121548112ddabcd21513" re.findall("abc|abcd",strvar) => abc,abc re.findall("abcd|abc",strvar) => abc,abcd # 3.练习 # 匹配小数 re.findall(r"\d+\.\d+",str) # 匹配小数和整数 re.findall(r"\d+\.\d+|\d+",strvar) re.findall(r"\d+(?:\.\d+)?",strvar) # 匹配135或者171的手机号 re.findall(r"(?:135|171)[0-9]{8}",strvar) re.findall(r"^(?:135|171)[0-9]{8}$",strvar) # 匹配 或者 re.findall(r"www.baidu.com|") re.findall(r"www_(?:baidu|oldboy)_com") # 获取第一个 obj = re.search(r"(?:www).(?:baidu|oldboy).(?:com)") obj.group() => # 获取分组()里边的数据 obj.groups() =>['www','baidu','com'] # “5*6-7/3” 匹配5*6 或者 7/3 print(re.findall('(?:\d+[*/]\d)|(?:\d/\d)',"5*6-7/3"))

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zyyjdj.html