Python——正则表达式
re模块与正则表达式的关系:
就像time模块与时间的关系,time只能使用时间而不能改变时间。re模块也只能使用正则表达式和正则表达式本身是没有关系的。
正则表达式:
1. 是一种匹配字符串的规则。
2. 匹配字符串:电话,身份证,IP地址
3. 表单验证:登录,注册时发送短信,进行输入号码的比较。
4. 爬虫:从网页源码中获取一些链接,重要数据等。·
正则表达式规则:
1. 本身是哪个字符,就匹配字符串中的哪个字符,除特殊字符外。
2. 字符组:[字符字符] 如:[0-9]
注:
1. 一个字符组只能匹配一个字符,当匹配多个时,是放到多个匹配组中的,而不是放在同一个匹配组中。而如果想放在同一个匹配组中,那么就要建多个字符组。
2. 都只能从小到大做匹配[1-9]而不能[9-1],因为要遵循ascii码中的序列来。常用字符组:[a-zA-Z]大小写字母,[a-zA-Z0-9]任意数字加大小写字母。
常用的正则表达元字符:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | '.' 默认匹配除\n之外的任意一个字符,若指定flag DOTALL,则匹配任意字符,包括换行 '^' 匹配字符开头,若指定flags MULTILINE,这种也可以匹配上(r "^a" , "\nabc\neee" ,flags = re.MULTILINE) '$' 匹配字符结尾,是必须某一个字符串做结尾。或e.search( "foo$" , "bfoo\nsdfsf" ,flags = re.MULTILINE).group()也可以 '|' 匹配|左或|右的字符,如果两个规则有重叠部分,将长的在前面,短的在后面。,re.search( "abc|ABC" , "ABCBabcCD" ).group() 结果 'ABC' '\' 转意的意思。re.search(' (abc){ 2 }(\|\| = ){ 2 } ',' xuanabcabc|| = || = ') 结果abcabc|| = || = '(...)' 分组匹配,re.search( "(abc){2}a(123|456)c" , "abcabca456c" ).group() 结果 abcabca456c '()' 表示分组,给一部分正则规定为一组,|或的符号作用域就可以缩小了。 '[]' 字符组 '[a-zA-Z]' 匹配某一段字符串中的所有大小写字母。re.search( "Y[a-zA-Z]+n" , "Xuan123Yongjun321" ) 结果 Yongjun [xyz] 字符集合。匹配所包含的任意一个字符。例如,“[abc]”可以匹配“plain”中的“a”。 [^xyz] 负值字符集合。匹配未包含的任意字符。例如,“[^abc]”可以匹配“plain”中的“plin”。 '\A' 只从字符开头匹配,re.search( "\Aabc" , "alexabc" ) 是匹配不到的 '\z' 匹配字符结尾,如果是换行,只匹配到换行前的结果,同$ '\d' (digit)匹配数字 0 - 9 '\D' 匹配非数字,包括特殊字符 '\w' (word)匹配数字,字母,下划线。 '\W' 匹配非数字,字母,下划线。 '\s' (space)匹配空白字符、\t、\n、\r , re.search( "\s+" , "ab\tc1\n3" ).group() 结果 '\t' '\S' 匹配任意非空白符 '\t' (table)制表符 '\n' ( next )换行符 '(?P<name>...)' 分组匹配 re.search( "(?P<province>[0-9]{4})(?P<city>[0-9]{2})(?P<birthday>[0-9]{4})" , "371481199306143242" ).groupdict( "city" ) 结果{ 'province' : '3714' , 'city' : '81' , 'birthday' : '1993' } 可以将值取出并以字典的形式列出。name为key,得出的值为value |
常用量词
1 2 3 4 5 | '*' 匹配 * 号前的字符 0 次或多次,re.findall( "ab*" , "cabb3abcbbac" ) 结果为[ 'abb' , 'ab' , 'a' ] '+' 匹配前一个字符 1 次或多次,re.findall( "ab+" , "ab+cd+abb+bba" ) 结果[ 'ab' , 'abb' ] '?' 匹配前一个字符 1 次或 0 次, 0 的意思是匹配的字符中有一个数可有可无。‘aal?’ 表示l可有可无的意思~ '{m}' 匹配前一个字符m次,re.search( "[0-9](3)" , "A4BC5Bab123" ).group() 结果 '123' '{n,m}' 匹配前一个字符n到m次,re.findall( "ab{1,3}" , "abb abc abbcbbb" ) 结果 'abb' , 'ab' , 'abb' ] |
贪婪匹配:
总是会在符合量词条件的范围内尽量多匹配。默认为贪婪模式。
非贪婪匹配:
总是匹配符合条件范围内尽量小的字符串。
.*?x :表示按照元字符规定在量词范围内匹配,一旦遇到x就停止。关键在于?,这里的问号在量词后面就表示非贪婪匹配。
关于*+?的小测试题:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | import re name = 'm-e-me-meet-meet' print (re.findall( 'me?' ,name)) [ 'm' , 'me' , 'me' , 'me' ] m肯定要有e要么有要么没有 import re name = 'm-e-me-meet-meet_123\t \n' print (re.findall( "m*" ,name)) #['m','me','mee','mee'] 匹配m或m以后的相同字符。 import re name = 'm-e-me-meet-meet_123\t \n' print (re.findall( "me+" ,name)) #['me', 'mee', 'mee'] 匹配m和e以后的相同字符。 |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)