python正则表达式

Python中正则表达式进行匹配字符串,需要用到一个模块re

re.match(r"正则表达式",匹配的字符串)

匹配成功则有返回值
即正则表达式为一个规范,匹配就是进行验证数据是否满足我的规范
一,匹配单个字符
1.匹配相同字符:

re.match(r"test","test")

2.匹配单个数字的字符\d

re.match(r"test\d",“test2”)
re.match(r"test\d",“test3”)

在这里插入图片描述当匹配test10时发现只匹配到了test1
可以发现\d只匹配单个数字
ret=re.match(r"test\d","test10") ret.group() 'test1'
在这里插入图片描述
3,匹配[]中列举的字符re.match(r"[匹配数字组]",待匹配字符串)
re.match(r"test[12345678]","test9")
在这里插入图片描述
此时没有返回值,说明匹配不成功
这段代码和上面功能相同,但是只有数字连续时才能用-
re.match(r"test[1-8]","test9")
4.匹配1-3 4-8的数字

re.match(r"test[1-34-8]","test9")

5.匹配数字字母组合:

re.match(r"test[1-8abc]","testa")

匹配结果:testa
记住一个原则:[]内的元素只匹配 一个

6,\w匹配单词字符即a-z,A-Z,0-9同时也匹配中文,及其他国家的Unicode语言(不推荐用)

re.match(r"test\w","test啊")

7,匹配空格和tab键\s

re.match(r"test\s","test ")

二,匹配多个字符
1.\d{1,2}匹配一位或两位数字

re.match(r"test\d{1,2},"test1")
re.match(r"test\d{1,2},"test12")

2.\d{1,3}匹配一位两位或三位

re.match(r"test\d{1,3},"test1")
re.match(r"test\d{1,3},"test12")
re.match(r"test\d{1,3},"test123")

3.注意{}指定的数字必须是连续的
4.?匹配前一个字符出现一次或0次,即要么有一次要么0次
5. *匹配前一个字符可以有0个有1个或者有n个,即可有可无
6.+匹配前一个字符出现一次或无限次,即至少有一次
7. .表示所以的字符,除了\n
8.{m}匹配前一个字符出现m次
9.{m,n}匹配前一个字符出现m到n次

re.match(r"021-?\d{8},"021-12345678")
re.match(r"021-?\d{8},"02112345678")

三,综合运用:
1.匹配电话号
要求:匹配区号后面的-可有可无,区号为3-4位

re.match(r"\d{3,4}-?\d{8},"0214-12345678")  #电话区号可以有三位也可以有四位
re.match(r"\d{3,4}-?\d{8},"02212345678")  

2.匹配html代码
要求:匹配html文件所以内容,包括换行符

html="""sdfsf
asdfsfsafwe4
asdfsadf
sdfsdf
sdafs“”“

当执行

re.match(r".*,html)

时,我们想匹配到html内的所以内容,但是此时只匹配到了

sdfsf

这是因为.虽然表示的是所以的字符但是他却不包含\n即回车符,那么我们怎么才能匹配到所有的呢?
此时需要:

re.match(r".*,html,re.S)

在match里增加一个参数re.S即可让.中包括回车
此时就可匹配到html内的所以内容
3.匹配163邮箱
要求:@前面可以有英文字母,下划线,数字,且为4-20位

re.match(r"[a-zA-Z_0-9]{4,20}@163.com",str)

但是此时输入123456@163acom
[email protected]
也会匹配成功,这是为什么呢?
因为.本身就是一个正则符号,表示所有的字符,所以,我们需要转义字符\同时用$表示字符结束,即必须字符的结尾和表达式一模一样,后面不能再有内容

re.match(r"[a-zA-Z_0-9]{4,20}@163\.com&",str)


\代表转义$代表字符结束
三,匹配开头结尾
1.$表示匹配字符串结尾,即前面的正则表达式匹配完成后,到$刚好为结尾

2.^表示匹配字符串开头,从这之后开始进行正则匹配(Python自带^说以不用写)

re.match(r"^abc[123456]$",str)

上面一段代码表示str必须以a为开头,以123456其中的任一个为结尾,否则匹配失败
四,分组等
指定特定匹配邮箱|代表或

re.match(r"[a-zA-Z_0-9]{4,20}@(163|126).com",str)

此时就能匹配163或126
1.获取分组内容分组:
()正则表达式可以取到括号内的内容

ret=re.match(r"[a-zA-Z_0-9]{4,20}@(163|126).com","[email protected]")
ret.group(1)

上面的代码运行后,得到的结果为:

126

即()通过group函数可以获得第几个小括号的内容:

ret=re.match(r"([a-zA-Z_0-9]{4,20})@(163|126).com","[email protected]")
ret.group(1)

运行上面代码获得的内容为

12344

因为此时第一个小括号加在了@前面
2.在正则表达式里面使用分组内容:

html="<h1>hello</h1>"
re.match(r"<\w*>.*</\w*>")

此时可以匹配,
但是h1是一对标签,我们怎么才能实现匹配<h1>hello</h2>这样前后标签名不相同的错误呢?
这时候我们可以利用分组:

html="<h1>hello</h1>"
re.match(r"<(\w*)>.*</\1*>")

在后面的\1获取分组1的内容,此时就能实现<h1>hello</h2>这样不符合规范的数据的识别
3.三给分组命名
给分组起名(注意为小写p):(?p<name>)

引用别名为name的分组匹配的字符串(注意为大P):(?P=name)
通过给分组命名上面的代码可以改为:

html="<h1>hello</h1>"
re.match(r"<(?p=h1\w*)>.*</?P=h1*>")
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章