????正则表达式,又称规则表达式(Regular Expression),是使用单个字符串来描述、匹配某个句法规则的字符串,常被用来检索、替换那些符合某个模式(规则)的文本
????简单来说,正则表达式就是使用: 字符串定义规则,并通过规则去验证字符串是否匹配
比如通过正则规则:(^[\w-]+(\.[\w-]+)*@[\w-]+(\.[\w-]+)+$)
,即可匹配一个字符由是否是标准邮箱格式
Python正则表达式使用re模块,并基于re模块中三个基础方法来做正则匹配,分别是:match、search、findall
(1)re.match(匹配规则,被匹配字符串)
:从被匹配字符串开头进行匹配,匹配成功返回匹配对象(包含匹配的信息),匹配不成功返回空
s='python haha python hehe python yoyo'
result = re.match('python',s)
print(result) # 返回:<re.Match object; span=(0,6),match='python'>
print(result.span()) # 返回:(0, 6)
print(result.group()) # 返回:python
s ='1python hahapython hehepython yoyo'
result = re.match('python', s)
print(result) # 返回:None
(2)search(匹配规则,被匹配字符串)
:搜索整个字符串,找出匹配的。从前向后,找到第一个后,就停止,不会继续向后
若整个字符串都找不到,返回None
s ='1python666haha666python666'
result = re.search('python', s)
print(result) # <re.Match object;span=(1,7),match='python'>
print(result.span()) # (1,7)
print(result.group()) # python
(3)findall(匹配规则,被匹配字符串)
:匹配整个字符串,找出全部匹配项
找不到返回空list:[]
s ='1python666haha666python666'
result = re.findall('python', s)
print(result) # ['python','python']
(3-1)单字符匹配:
.
:匹配任意1个字符(除了\n),.匹配点本身
[]
:匹配[]中列举的字符,[]内可以写:[a-zA-Z0-9]这三种范围组合或指定单个字符如[aceDFG135]
\d
:匹配数字,即0-9
\D
:匹配非数字
\s
:匹配空白,即空格、tab键
\S
:匹配非空白
\w
:匹配单词字符,即a-z、A-Z、0-9、-
\W
:匹配非单词字符
备注:字符串的r标记,表示当前字符串是原始字符串,即内部的转义字符无效而是普通字符
小例子:
s='12@asd'
# 1.找出全部数字:
re.findall(r'\d', s)
# 2.找出特殊字符:
re.findall(r'\W', s)
# 3.找出全部英文字母:
re.findall(r'[a-zA-Z]', s)
(3-2)数量匹配
*
:匹配前一个规则的字符出现0至无数次
+
:匹配前一个规则的字符出现1至无数次
?
:匹配前一个规则的字符出现0次或1次
{m}
:匹配前一个规则的字符出现m次
{m,}
:匹配前一个规则的字符出现最少m次
{m,n}
:匹配前一个规则的字符出现m到n次
(3-3)边界匹配
^
:匹配字符串开头
$
:匹配字符串结尾
\b
:匹配一个单词的边界
\B
:匹配非单词边界
(3-4)分组匹配
|
:匹配左右任意一个表达式
()
:将括号中字符作为一个分组
(1)匹配账号,只能由字母和数字组成,长度限制6到10位
r = '^[0-9a-zA-Z]{6,10}$'
s ='123456_'
print(re.findall(r,s))
(2)匹配qq号,要求纯数字,长度5-11,第一位不为0
r = r'^[1-9][0-9][4,10]$'
s = '123453678'
print(re.findall(r,s))
(3)匹配邮箱地址,只允许q9、163、gmail这三种邮箱地址
r = r'(^[\w-]+(\.[\w-]+)*@(qq|163|gmail)(\.[\w-]+)+$)'
s = 'a.b.c.d.e.f.g@126.com.a.z.c.d.e'
print(re.match(r,s))