大家好,又见面了,我是你们的朋友全栈君。
正则表达式
序言
在如今这个网络横行的时代,网络对我们的生活起着举足轻重的作用,在我们日常生活中是随处可见的:坐车买票,日常生活物品的购买,医院就医。。。。在我们网上购物的时候会进入登陆界面进行一系列的基本信息的验证例如:用户名,电话号码等。如果输入的格式不正确就会提示你输入信息错误重新输入,那么计算机怎么就知道你所输入的是错误的呢?
我们知道用户输入的所有的信息内容都是字符串类型,那么也就是说只要对输入的字符串进行一定的处理就可以得到最终的结果,这就涉及到了一个专业的词汇叫正则表达式:正则表达式就是专门用来对字符串进行一系列处理的。我们要了解正则首先要明白什么是正则表达式。。。
什么是正则表达式
正则表达式就是字符串匹配的规则,已经观存在的规则,是用来对字符串进行匹配的,首先你要知道的是,谈到正则,只和字符串相关了 正则表达式不仅在python领域,在整个编程届都占有举足轻重的地位。
官方定义:正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑。
我们已经知道了什么是正则,现在就让我们先来看一些实际的应用在线测试工具 http://tool.chinaz.com/regex/
之前已经说过正则之和字符串有关系,通过以上的测试工具在其中随便输入内容,具体的每一个元素都是一个字符会得到具体的结果,我们通过多次的测试发现结果都是有一定的规律的,在python的正则中通过以下的内容来实现这些规律:
字符组 :
[字符组] 在同一个位置可能出现的各种字符组成了一个字符组,在正则表达式中用[]表示 字符分为很多类,比如数字、字母、标点等等。 假如你现在要求一个位置”只能出现一个数字”,那么这个位置上的字符只能是0、1、2…9这10个数之一。
正则 | 待匹配字符 | 匹配结果 | 说明 |
---|---|---|---|
[0123456789] | 8 | True | 在一个字符组里枚举合法的所有字符,字符组里的任意一个字符和"待匹配字符"相同都视为可以匹配 |
[0123456789] | a | False | 由于字符组中没有"a"字符,所以不能匹配 |
[0-9] | 7 | True | 也可以用-表示范围,[0-9]就和[0123456789]是一个意思 |
[a-z] | s | True | 同样的如果要匹配所有的小写字母,直接用[a-z]就可以表示 |
[A-Z] | B | True | [A-Z]就表示所有的大写字母 |
[0-9a-fA-F] | e | True | 可以匹配数字,大小写形式的a~f,用来验证十六进制字符 |
字符:
元字符 | 匹配内容 |
---|---|
. | 匹配除换行符以外的任意字符 |
w | 匹配字母或数字或下划线 |
s | 匹配任意的空白符 |
d | 匹配数字 |
n | 匹配一个换行符 |
t | 匹配一个制表符 |
b | 匹配一个单词的结尾 |
^ | 匹配字符串的开始 |
$ | 匹配字符串的结尾 |
W | 匹配非字母或数字或下划线 |
D | 匹配非数字 |
S | 匹配非空白符 |
a|b | 匹配字符a或字符b |
() | 匹配括号内的表达式,也表示一个组 |
[…] | 匹配字符组中的字符 |
[^…] | 匹配除了字符组中字符的所有字符 |
量词:
量词 | 用法说明 |
---|---|
* | 重复零次或更多次 |
| 重复一次或更多次 |
? | 重复零次或一次 |
{n} | 重复n次 |
{n,} | 重复n次或更多次 |
{n,m} | 重复n到m次 |
. ^ $
正则 | 待匹配字符 | 匹配结果 | 说明 |
---|---|---|---|
海. | 海燕海东青 | 海燕海东青 | 匹配所有”海.”的字符 |
^海. | 海燕海东青 | 海燕 | 只从开头匹配”海.” |
海.$ | 海燕海东青 | 海东青 | 只匹配结尾的”海.$” |
* ? { }
正则 | 待匹配字符 | 匹配结果 | 说明 |
---|---|---|---|
李.? | 李莲英和李二棍子 | 李莲李二 | ?表示重复零次或一次,即只匹配"李"后面一个任意字符 |
李.* | 李莲英和李二棍子 | 李莲英和李二棍子 | *表示重复零次或多次,即匹配"李"后面0或多个任意字符 |
李. | 李莲英和李二棍子 | 李莲英和李二棍子 | 表示重复一次或多次,即只匹配"李"后面1个或多个任意字符 |
李.{1,2} | 李莲英和李二棍子 | 李莲英和李二棍 | {1,2}匹配1到2次任意字符 |
注意:前面的*, ,?等都是贪婪匹配,也就是尽可能匹配,后面加?号使其变成惰性匹配
正则 | 待匹配字符 | 匹配结果 | 说明 |
---|---|---|---|
李.*? | 李莲英和李二棍子 | 李李 | 惰性匹配 |
字符集[][^]
正则 | 待匹配字符 | 匹配结果 | 说明 |
---|---|---|---|
李[莲英二棍子]* | 李莲英和李二棍子 | 李莲英李二棍子 | 表示匹配"李"字后面[莲英二棍子]的字符任意次 |
李[^和]* | 李杰和李莲英和李二棍子 | 李莲英李二棍子 | 表示匹配一个不是"和"的字符任意次 |
[d] | 456bdha3 | 4563 | 表示匹配任意一个数字,匹配到4个结果 |
[d] | 456bdha3 | 4563 | 表示匹配任意个数字,匹配到2个结果 |
p.p1 { margin: 0; font: 12px ".PingFang SC"; color: rgba(69, 69, 69, 1) }
分组 ()与 或 |[^]
身份证号码是一个长度为15或18个字符的字符串,如果是15位则全部