**参考API: **菜鸟教程
正则表达式,又称规则表达式(Regular Expression),是使用单个字符串来描述、匹配某个句法规则的字符
来检索、替换那些符合某个模式(规则)的文本。
简单来说:通过规则去验证字符串是否匹配。
比如,验证一个字符串是否是符合条件的电子邮箱地址,只需要配置好正则规则,即可匹配任意邮箱。
比如通过正则规则: (^[\w-]+(\.[\w-]+)*@[\w-]+(\.[\w-]+)+$)
即可匹配一个字符串是否是标准邮箱格式
match 是从头匹配,匹配第一个命中项 ,未匹配返None
search全局搜索,匹配第一个命中项, 未匹配返None
findall 全局匹配,匹配全部命中项,未匹配返回值[]列表,如果正则有(),会每个组结果返回结果
Python正则表达式,使用re模块,并基于re模块中三个基础方法来做正则匹配。
分别是:match、search、findall三个基础方法
从被匹配字符串开头进行匹配,匹配成功返回匹配对象(包含匹配的信息),匹配不成功返回空。
注意:match()尝试从字符串的起始位置匹配一个模式**,如果不是起始位置匹配成功的话**,match() 就返回 none
import re
s = 'python itheima python itheima python itheima'
# 第一个是匹配规则,第二个是被匹配,要筛选的数据,返回匹配的下标span=(0, 6)
result = re.match("python", s )
print(result) # 打印结果:
print(result.span()) # 打印为 (0,6)
print(result.group()) # python
import re
s='1python itheima python itheima python itheima'
result=re.match('python' s)
print(result) # None
match是匹配开头,后面的是不匹配
注意:搜索整个字符串,找出匹配的。从前向后,找到第一个后,就停止,不会继续向后
import re
s='1python666itheima666python666'
result=re.search('python',s)
print(result) #
print(result.span()) # (1, 7)
print(result.group()) # python
import re
s='itheima666'
result=re.search('python', s)
print(result) # None
注意:匹配整个字符串,找出全部匹配项
import re
s='1python666itheima666python666'
result = re.findall('python', s)
print(result) # ['python','python']
import re
s='1python666itheima666python666'
result =re.findall('itcast', s)
print(result) # []
基础的字符串匹配,正则最强大的功能在于元字符匹配规则
字符 | 功能 |
---|---|
. | 点匹配任意1个字符(除了\n),\. 匹配点本身 |
[] | 匹配[]中列举的字符 |
\d | 匹配数字,即0-9 |
\D | 匹配非数字 |
\s | 匹配空白,即空格、tab键 |
\S | 匹配非空白 |
\w | 匹配单词字符,即a-z、A-Z、0-9、_ |
\W | 匹配非单词字符 |
import re
s = "itheima1 @@python2 !!666 ##itcast3"
# 字符串前面带上r的标记,表示字符串中转义字符串无效,就是普通字符的意思
result = re.findall(r'\d', s)
print(result) # 打印:['1', '2', '6', '6', '6', '3']
import re
s = "itheima1 @@python2 !!666 ##itcast3"
# 字符串前面带上r的标记,表示字符串中转义字符串无效,就是普通字符的意思
result = re.findall(r'\W', s)
print(result) # [' ', '@', '@', ' ', '!', '!', ' ', '#', '#']
import re
s="itheima1 @@python2 !!666 ##itcast3"
# 字符串前面带上r的标记,表示字符串中转义字符串无效,就是普通字符的意思
result = re.findall(r'[a-zA-Z]', s)
print(result)
# 打印:['i', 't', 'h', 'e', 'i', 'm', 'a', 'p', 'y', 't', 'h', 'o', 'n', 'i', 't', 'c', 'a', 's', 't']
字符 | 功能 |
---|---|
* | 匹配前一个规则的字符出现0至无数次 |
+ | 匹配前一个规则的字符出现1至无数次 |
? | 匹配前一个规则的字符出现0次或1次 |
{m} | 匹配前一个规则的字符出现m次 |
{m,} | 匹配前一个规则的字符出现最少m次 |
{m,n} | 匹配前一个规则的字符出现m到n次 |
字符 | 功能 |
---|---|
^ | 匹配字符串开头 |
$ | 匹配字符串结尾 |
\b | 匹配一个单词的边界 |
\B | 匹配非单词边界 |
字符 | 功能 |
---|---|
| | 匹配左右任意一个表达式 |
() | 将括号中字符作为一个分组 |
注意:正则不要随意加空格
规则为:^[0-9a-zA-Z]{6,10}$
import re
r = '^[0-9a-zA-Z]{6,10}$'
s = '123456789a'
print(re.findall(r,s)) # 打印:['123456789a']
规则 : ^[1-9][0-9]{4,10}&
import re
r = '^[1-9][0-9]{4,10}$' # 注意:[1-9]匹配第一位,[0-9]匹配后面4到10位
s = '123456789'
print(re.findall(r,s)) #['123456789']
3.7.3 匹配邮箱地址,只允许qq、163、gmail这三种邮箱地址
规则为:^[\w-]+(\.[\w-]+)*@(qq|163|gmail)(\.[\w-]+)+$
import re
r = r'(^[\w-]+(\.[\w-]+)*@(qq|163|gmail)(\.[\w-]+)+$)' # 技巧使用findall整个整体包起来
s = '[email protected]'
print(re.findall(r, s))
打印结果:[('[email protected]', '.d', 'qq', '.z')]
优化:使用match
import re
r = r'^[\w-]+(\.[\w-]+)*@(qq|163|gmail)(\.[\w-]+)+$'
s = '[email protected]'
print(re.match(r, s))
打印结果: