一. 正则表达式
正则表达式是一个描述字符模式的对象,可以用来
检查一个串是否含有某种子串、将匹配的子串做
替换或者从某个串中取出符合某个条件的子串
等
# 使用语法
import re
# 6~18位密码 只能包含a-zA-Z0-9_ 不能以数字为开头
result = re.match("^[^\d]\w{5,17}$","def456xxx")
if(result):
print("合法")
else:
print("不合法")
## 匹配规则
### 单字符匹配
#### x
匹配 x
#### [xyz]
1. [abc]
匹配 a , b , c 任意一个字符
2. [0-9]
匹配任意一个数字
3. [a-zA-Z]
匹配 任意一个字母
4. [a-zA-Z0-9-]
匹配任意字母、数字 和 -
5. [^0-9]
匹配任意一个非数字
### 多字符匹配
1. X*
匹配 ==0个或多个== X 匹配的内容
2. X+
匹配 ==1个或多个== X 匹配的内容
3. X?
匹配 ==0个或1个== X 匹配的内容
4. X{m}
匹配 ==m个== X 匹配的内容
5. X{m, }
匹配 ==至少m个== X匹配的内容
6. X{m, n}
匹配 ==至少m个,最多n个== X匹配的内容
PS: m <= n
#### 元字符
1. \d
等价与 [0-9]
2. \D
等价与 [^0-9]
3. \w
等价与 [a-zA-Z0-9_]
4. \W
对 \w 取反
5. \s
匹配任意一个空白字符
包括 空格、制表符、换行符等
6. \S
匹配任意一个非空白字符
#### 点字符
1. . (dot)
匹配 除 换行 符 之外的任意一个字符
2. \\.
匹配 一个 点
### 贪婪式表达式
1. X*
等价与 X{0,}
2. X+
等价与 X{1, }
3. X?
等价与X{0,1}
### 非贪婪式表达式
1. *?
等价与 X{0,}
2. X+?
等价与 X{1, }
3. X??
等价与X{0,1}
非贪婪式表达式、优先匹配 表达式后面的正则匹配的内容,非贪婪式表达式 尽可能少的匹配元素
### 限定符
^
出现在正则的头部
代表以 ... 开头
$
出现在 正则的尾部
代表 以 ... 结尾
### 选择
|
(a|b)
## 正则修饰符
修饰符 | 作用
---|---
re.I | 使匹配大小写不敏感
re.S | 使.可以匹配换行符\n
re.M | 多行匹配,影响^$
re.L | 做本地化识别匹配 会影响\w\W\b\B(基本不使用)
re.U | 根据unicode字符集解析字符(python2支持 python移除)
### 常用的正则表达式表
#### 一、数字的正则表达式
```
- 数字:
^[0-9]*$
- n位的数字:
^\d{n}$
- 至少n位的数字:
^\d{n,}$
- m-n位的数字:
^\d{m,n}$
- 零和非零开头的数字:
^(0|[1-9][0-9]*)$
- 非零开头的最多带两位小数的数字:
^([1-9][0-9]*)+(.[0-9]{1,2})?$
- 带1-2位小数的正数或负数:
^(\-)?\d+(\.\d{1,2})?$
- 正数、负数、和小数:
^(\-|\+)?\d+(\.\d+)?$
```
#### 二、字符的正则表达式
```
- 汉字:\^[\u4e00-\u9fa5]{0,}$
var str = "38u48djhfod中国,@##@!_)+bia發財サービス二條한국어國家";
var reg = /[\u4e00-\u9fa5]+/g;
console.log(str.match(reg));
- 英文和数字:
^[A-Za-z0-9]+$ 或 ^[A-Za-z0-9]{4,40}$
- 长度为3-20的所有字符:
^.{3,20}$
- 由26个英文字母组成的字符串:
^[A-Za-z]+$
- 由26个大写英文字母组成的字符串:
^[A-Z]+$
- 由26个小写英文字母组成的字符串:
^[a-z]+$
- 由数字和26个英文字母组成的字符串:
^[A-Za-z0-9]+$
- 由数字、26个英文字母或者下划线组成的字符串:
^\w+$ 或 ^\w{3,20}$
- 中文、英文、数字包括下划线:
^[\u4E00-\u9FA5A-Za-z0-9_]+$
- 中文、英文、数字但不包括下划线等符号:
^[\u4E00-\u9FA5A-Za-z0-9]+$ 或 ^[\u4E00-\u9FA5A-Za-z0-9]{2,20}$
```
#### 特殊需求正则表达式
```
- Email地址:
^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$
- 域名:
[a-zA-Z0-9][-a-zA-Z0-9]{0,62}(/.[a-zA-Z0-9][-a-zA-Z0-9]{0,62})+/.?
- URL:
[a-zA-z]+://[^\s]* 或 ^http://([\w-]+\.)+[\w-]+(/[\w-./?%&=]*)?$
- 手机号码:
\^[1][3,4,5,7,8][0-9]{9}$
- 15或18位身份证:
^\d{15}|\d{18}$
- 15位身份证:
^[1-9]\d{7}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}$
- 18位身份证:
^[1-9]\d{5}[1-9]\d{3}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{4}$
- 短身份证号码(数字、字母x结尾):
^([0-9]){7,18}(x|X)?$ 或 ^\d{8,18}|[0-9x]{8,18}|[0-9X]{8,18}?$
- 帐号是否合法(字母开头,允许5-16字节,允许字母数字下划线):
\^[a-zA-Z][a-zA-Z0-9_]{4,15}$
- 密码(以字母开头,长度在6~18之间,只能包含字母、数字和下划线):
\^[a-zA-Z]\w{5,17}$
- 强密码(必须包含大小写字母和数字的组合,不能使用特殊字符,长度在8-10之间):
\^(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).{8,10}$
- 日期格式:
^\d{4}-\d{1,2}-\d{1,2}
- IP地址:
\d+\.\d+\.\d+\.\d+
```
## 其他符号 了解即可
### 分组(...)
(\d+)
对匹配内容进行分组
(?<key>\d+)
命名分组
正则匹配的内容会交给 key
### 断言
?= 正向确定断言
示例: /\d+(?=%)/.exec("昨天股票涨了20%,今天跌了50%,损失了8000元")
只匹配百分号之前的数字
?! 正向否定断言
示例 :/\d{2,}(?!%)/.exec("昨天股票涨了20%,今天跌了50%,损失了8000元")
只匹配非百分号之前的数字
?<= 反向确定断言
示例: /(?<=\$)\d+/.exec("$1 兑换 ¥6")
只匹配美元符号之后的数字
?<! 反向否定断言
示例 : /(?<!\$)\d+/.exec("$1 兑换 ¥6")
只匹配不在美元符号后面的数字