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
和 123456@163.comcom
也会匹配成功,这是为什么呢?
因为.
本身就是一个正则符号,表示所有的字符,所以,我们需要转义字符\
同时用$
表示字符结束,即必须字符的结尾和表达式一模一样,后面不能再有内容
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","12344@126.com")
ret.group(1)
上面的代码运行后,得到的结果为:
126
即()通过group函数可以获得第几个小括号的内容:
ret=re.match(r"([a-zA-Z_0-9]{4,20})@(163|126).com","12344@126.com")
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*>")