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以后的相同字符。

 

posted @   新兵蛋Z  阅读(233)  评论(0编辑  收藏  举报
编辑推荐:
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示