Python-正则表达式

正则表达式定义

普通字符和元字符构成的字符串,描述一类字符串规则

元字符

  • 有特殊含义的字符
表达式匹配
.小数点可以匹配除了换行符\n以外的任意一个字符
|逻辑或操作符 ,或
[]匹配字符集中的一个字符
[^]对字符集求反,也就是上面的反操作。尖号必须在方括号里的最前面
-定义[]里的一个字符区间,例如[a-z]
\对紧跟其后的一个字符进行转义
()对表达式进行分组,将圆括号内的内容当做一个整体,并获得匹配的值
  •  记得要导包, import re 

例如

import re
a = re.findall("a.c","abcdefg")
print(a) #['abc']

#匹配a或者c
a = re.findall("a|c","abdefgc")
print(a) #['a', 'c']

#匹配列表中的任意任意一个字符
a = re.findall("[acbe]","abdefgc")
print(a) #['a', 'b', 'e', 'c']

#除了a和c其余都要
a = re.findall("[^ac]","adfgcvs")
print(a) #['d', 'f', 'g', 'v', 's']

#a-c 意思是匹配abc三个字符
a = re.findall("[a-c]","adfgcvs")
print(a) #['a', 'c']

#意思是把adf作为一个整体进行输出
a = re.findall("(adf)","adfgcvs")
print(a) #['adf']

#去掉小数点的特殊含义,他就是一个小数点
a = re.findall("\.","adf.gcvs")
print(a) #['.']

转义字符

表达式匹配
\r, \n匹配回车和换行符
\t匹配制表符
\\匹配斜杠\
\^匹配^符号
\$匹配$符号
\.匹配小数点.

预定义匹配字符集

表达式匹配
\d任意一个数字,0~9中的任意一个
\w任意一个字母或数字或下划线,也就是A~Z,a~z,0~9,_ 中的任意一个
\s空格、制表符、换页符等空白字符的其中任意一个
\D\d的反集,也就是非数字的任意一个字符,等同于[^\d]
\W\w的反集,也就是[^\w]
\S\s的反集,也就是[^\s]

例如

#匹配出0-9的数字
a = re.findall("\d","abc1e34r")
print(a) #['1', '3', '4']

# `\d`的反集,也就是非数字的任意一个字符,等同于`[^\d],除数字以外的
a = re.findall("\D","abc 123")
print(a)  #['a', 'b', 'c', ' ']

# 任意一个字母或数字或下划线,也就是A~Z,a~z,0~9,_ 中的任意一个  
a = re.findall("\w","abwc1e34r_")
print(a)  #['a', 'b', 'w', 'c', '1', 'e', '3', '4', 'r', '_']

#`\w`的反集,也就是`[^\w]`  ,除字母以外的
a = re.findall("\W","abwc1 e34r_")
print(a)  #[' ']

#都可以匹配下划线了,那空格怎么匹配
a = re.findall("\s","abc 123")
print(a)  #[' ']

#  `\s`的反集,也就是`[^\s]`,除空格以外  
a = re.findall("\S","abc 123")
print(a)  #['a', 'b', 'c', '1', '2', '3']

重复匹配

表达式匹配
{n}表达式重复n次,比如\d{2}相当于\d\d,a{3}相当于aaa
{m,n}表达式至少重复m次,最多重复n次。比如ab{1,3}可以匹配ababbabbb
{m,}表达式至少重复m次,比如\w\d{2,}可以匹配a12,_1111,M123等等
?匹配表达式0次或者1次,相当于{0,1},比如a[cd]?可以匹配a,ac,ad
+表达式至少出现1次,相当于{1,},比如a+b可以匹配ab,aab,aaab等等
*表达式出现0次到任意次,相当于{0,},比如\^*b可以匹配b,^^^b等等

例如

import re

#意思是ll要有两个
a = re.findall("l{2}","yesall")
print(a)

#意思是l要有2个到4个
a = re.findall("l{2,4}","alyesallnoalllowallll")
print(a) #['ll', 'lll', 'llll']

#意思是l最少要有两个,上不封顶
a = re.findall("l{2,}","alyesallnoallll")
print(a) #['ll', 'llll']

#意思是l至少有一个
a = re.findall("l+","yellowlow")
print(a) #['ll', 'l']

#意思是l至少有0个
a = re.findall("l*","yellowlow")
print(a) #['', '', 'll', '', '', 'l', '', '', '']

位置匹配

表达式匹配
^在字符串开始的地方匹配,符号本身不匹配任何字符
$在字符串结束的地方匹配,符号本身不匹配任何字符
\b匹配一个单词边界,也就是单词和空格之间的位置,符号本身不匹配任何字符
\B匹配非单词边界,即左右两边都是\w范围或者左右两边都不是\w范围时的字符缝隙

例如

#位置匹配

#^  以什么开头
a = re.findall("^185","1853999999")
print(a) #['185']

# $ 以什么结尾
b = re.findall("w$","yellow")
print(b) #['w']

贪婪模式与非贪婪模式

“贪婪模式”总是尝试匹配尽可能多的字符;“非贪婪模式”则相反,总是匹配尽可能少的字符

练习

1.长度为8-10的用户密码(以字母开头、数字、下划线)

2.电子邮箱验证

3.电话号码的验证

 答:

# 1.长度为8-10的用户密码(以字母开头、数字、下划线)
import re

#输入一个密码,验证长度为8-10的用户密码(以字母开头、数字、下划线)
s = input("请输入一个密码:")
a= re.findall("^[a-zA-Z]\w{7,9}",s) #从0开始
print(a)

#2.电子邮箱验证
s = input("请输入一个电子邮箱:")
a= re.findall("^\w+@\w+[\.]\w+$",s) #从0开始
print(a) #newglf@163.com

#3.电话号码的验证
s = input("请输入一个电话:")
zengze = "^1[3,4,8,]\d{9}$"
^1[3-9]\d{9}
a= re.findall(zengze,s) #从0开始
print(a) 

#联通电话
#130、131、132、145、155、156、166、167、171、175、176、185、186、196
s = input("请输入一个电子邮箱:")
zengze = "^(13[0,1,2]|14[5]|15[5,6]|16[6,7]|17[1,5,6]|18[5,6]|19[6])\d{8}$"
a= re.search(zengze,s)
print(a) 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值