正则表达式就是记录文本规则的代码。
在开发过程中,我们需要查找某些复杂规则的字符串,比如邮箱,手机号,图片地址。这个时候就要使用正则表达式了。
正则表达式的样子:
0\d{2}-\d{8} 这个就是正则表达式,表达的意思是匹配的是座机号码。
正则表达式的特点:
正则表达式的语法很让人头疼,可读性差。
正则表达式的通用性很强,能使用与各种语言。
代码示范:
# 导入re模块
import re
# 通过re调用match方法 进行字符串匹配
# 如果match匹配成功,那么返回一个re 对象 如果不成功,那返回一个空值.
ret = re.match('itcast','itcast.cn') # 精确匹配
# re中的match 模块只能从头匹配
# ret = re.match('itcast','www.itcast.cn') # 精确匹配
print(ret)
if ret:
print(ret.start()) # 匹配的开始
print(ret.end()) # 匹配的结束
print(ret.span()) # 匹配的区间 左闭右开
# 获取匹配内容
print(ret.group())
匹配单个字符:
代码 | 功能 |
. |
匹配任意1个字符(除了\n) |
[ ] |
匹配[ ]中列举的字符 |
\d |
匹配数字,即0-9 |
\D |
匹配非数字,即不是数字 |
\s |
匹配空白,即 空格,tab键 |
\S |
匹配非空白 |
\w |
匹配非特殊字符,即a-z、A-Z、0-9、_、汉字 |
\W |
匹配特殊字符,即非字母、非数字、非汉字 |
import re
# .
print(re.match('.','123'))
print(re.match('.','abc'))
print(re.match('.','一二三'))
print(re.match('.','#$%^&'))
print(re.match('.','\n'))
print('*' * 20)
# [] []中的任意一个与‘ ’ 中的第一个进行匹配
print(re.match('[123]','123'))
print(re.match('[123]','223'))
print(re.match('[123]','323'))
print(re.match('[123]','145'))
print(re.match('[hH]','hello'))
print(re.match('[hH]','Hello'))
print(re.match('[hH]','python'))
print(re.match('[0123456789]','2'))
print(re.match('[0123456789]','a'))
print(re.match('[0-9]','2')) # 0到9 进行匹配
print(re.match('[0-9]','a'))
print(re.match('[0-46-9]','3')) # 0-4和6-9 里匹配
print('*' * 20)
# \d
print(re.match('\d','2')) # 0到9 进行匹配
print(re.match('\d','a'))
print('*' * 20)
# \D
print(re.match('\D','2')) # \D 匹配非数字,即不是数字
print(re.match('\D','a'))
print('*' * 20)
# \s
print(re.match('\s',' '))
print(re.match('\s',' '))
print(re.match('\s','\n'))
print(re.match('\s','a'))
print('*' * 20)
# \S
print(re.match('\S',' '))
print(re.match('\S',' '))
print(re.match('\S','\n'))
print(re.match('\S','a'))
print('*' * 20)
# \w
print(re.match('\w','d'))
print(re.match('\w','F'))
print(re.match('\w','5'))
print(re.match('\w','_'))
print(re.match('\w',''))
print(re.match('\w','一'))
print(re.match('\w','&'))
print('*' * 20)
# \W
print(re.match('\W','d'))
print(re.match('\W','F'))
print(re.match('\W','5'))
print(re.match('\W','_'))
print(re.match('\W',''))
print(re.match('\W','一'))
print(re.match('\W','&'))
匹配多个字符:
代码 | 功能 |
* |
匹配前一个字符出现0次或者无限次,即可有可无 |
+ |
匹配前一个字符出现1次或者无限次,即至少有1次 |
? |
匹配前一个字符出现1次或者0次,即要么有1次,要么没有 |
{m} |
匹配前一个字符出现m次 |
{m,n} |
匹配前一个字符出现从m到n次 |
{m,} |
至少匹配m个 |
import re
# *
print(re.match('\w*','a'))
print(re.match('\d*','a'))
print(re.match('[a1]*','a'))
print(re.match('\d*','1234589a123')) # 匹配到9就结束了。
print('*' * 10)
# +
print(re.match('\w+','a'))
print(re.match('\d+','a'))
print(re.match('[a1]+','a'))
print(re.match('\d+','1234589a123'))
print('*' * 10)
# ?
print(re.match('\d?','1'))
print(re.match('\d?','a'))
print(re.match('\d?','123'))
print('*' * 10)
# {m,n}
print(re.match('.{2,4}','1'))
print(re.match('.{2,4}','1234'))
print(re.match('.{2,4}','12345'))
print(re.match('.{2}','1'))
print(re.match('.{2}','12'))
print(re.match('.{2}','123'))
print('*' * 10,'至少匹配m个')
# 至少匹配m个
print(re.match('.{2,}','1'))
print(re.match('.{2,}','12'))
print(re.match('.{2,}','123'))
print(re.match('.{2,}','1234'))
print('*' * 10)
# 匹配一个座机电话
print(re.match('\d{3,4}-\d{7,8}','010-8888888'))
print(re.match('\d{3,4}-\d{7,8}','021-77777777'))
print(re.match('\d{3,4}-\d{7,8}','022-666666'))
print(re.match('\d{3,4}-\d{7,8}','0451-8888888'))
print(re.match('\d{3,4}-\d{7,8}','9876-1234566'))
print(re.match('\d{3,4}-\d{7,8}','0451-0234566'))
print(re.match('0\d{2,3}-[1-9]\d{6,7}','9876-1234566'))
print(re.match('0\d{2,3}-[1-9]\d{6,7}','0451-0234566'))
指定匹配开头,结束和指定除外的字符:
代码 | 功能 |
^ | 匹配字符串开头 |
$ |
匹配字符串结尾 |
[^xxx] |
除指定字符外的字符 |
import re
# ^
print(re.match('^\d+','1'))
print(re.match('^\d+','123'))
print(re.match('^\d+','a123'))
# [^]
print(re.match('[^\d]+','1'))
print(re.match('[^\d]+','a'))
print(re.match('[^\d]+','aa'))
print(re.match('[^\d]+','12'))
# ^[^] 以 除指定字符开头的规则
print(re.match('^[^\d]+','1abc'))
print(re.match('^[^\d]+','abc1'))
# $
print(re.match('\d$','1'))
print(re.match('.*\d$','11')) # .# 表示任意个
print(re.match('.*\d$','a11'))
print(re.match('.*\d$','11a'))
匹配分组:
代码 | 功能 |
| |
匹配左右任意一个表达式 |
(ab) |
将括号中字符作为一个分组 |
\num |
引用分组num匹配到的字符串 |
(?P |
分组起别名 |
(?P=name) |
引用别名为name分组匹配到的字符串 |
import re
# |
print(re.match('[a-z]|[A-Z]ython','Python'))
print(re.match('[a-z]|[A-Z]ython','python'))
print(re.match('[a-z]|[A-Z]ython','jython'))
print(re.match('[a-z]|[A-Z]ython','1ython'))
print(re.match('[a-z]|[A-Z]ython','a'))
print('*' * 40 ,'(|)')
# (|)
print(re.match('([a-z]|[A-Z])ython','Python'))
print(re.match('([a-z]|[A-Z])ython','python'))
print(re.match('([a-z]|[A-Z])ython','jython'))
print(re.match('([a-z]|[A-Z])ython','1ython'))
print(re.match('([a-z]|[A-Z])ython','a')) # ython 不匹配
# 匹配一个邮箱是否是qq.com/163.com/sina.com
print(re.match('[a-zA-Z0-9_]{4,8}@(qq|163|sina).com','[email protected]'))
print(re.match('[a-zA-Z0-9_]{4,8}@(qq|163|sina).com','123456@qq'))
print(re.match('[a-zA-Z0-9_]{4,8}@(qq|163|sina).com','123456@163'))
print(re.match('[a-zA-Z0-9_]{4,8}@(qq|163|sina).com','[email protected]'))
print(re.match('[a-zA-Z0-9_]{4,8}@(qq|163|sina)\.com','123456@sinaacom'))
# () 匹配分组
# 销量:888 库存:99999
# ret = re.match('.*(\d+).*(\d+)','销量:888 库存:99999')
ret = re.match('销量:(\d+) 库存:(\d+)','销量:888 库存:99999')
print(ret)
print(ret.group())
print(ret.group(0))
print(ret.group(1))
print(ret.group(2))
# \num
ret = re.match('<[a-zA-Z0-9]+>(.*)[a-zA-Z0-9]+>','皮鞋皮鞋')
print(ret)
# ret = re.match('<[a-zA-Z0-9]+>(.*)[a-zA-Z0-9]+>','皮鞋皮鞋')
ret = re.match('<([a-zA-Z0-9]+)>(.*)\\1>','皮鞋皮鞋')
print(ret)
# r'' 正则表达式中的原生字符串,表示在字符串中的字符都是普通字符,无特殊意义
ret = re.match(r'<([a-zA-Z0-9]+)>(.*)\1>','皮鞋皮鞋')
print(ret)
print(ret.group(2))
# 为分组设置名 (?P) 通过分组名获取分组 (?P=name)
ret = re.match(r'<(?P[a-zA-Z0-9]+)>(.*)(?P=mk)>','皮鞋皮鞋')
print(ret)
print(ret.group(2))