正则表达式
正则表达式(regex)
正则表达式与语言无关,是一套规则,用来匹配字符串。
作用
1、检测一个输入的字符串是否合法。
- web开发项目,表单验证。用户输入一个内容的时候,我们要提前做检测,将不合法的内容直接返回,能够提高程序的效率并且减轻服务器的压力。
2、从一个大文件中找到所有符合规则的内容。
- 日志分析、爬虫。能够高效的从一大段文字中快速找到符合规则的内容。
正则规则
- 1、所有规则中的字符可以刚好匹配到字符串中的内容。
- 2、在正则表达式中能够帮助我们表示匹配内容的符号都是正则中的元字符。
元字符
-
字符组
[ ]
- 一个字符组中括号只表示一个字符位置
[0-9]:匹配0123456789中任意一个数字 [a-z]:匹配任意一个小写字母 [A-Z]:匹配任意一个大写字母 [a-zA-Z]:匹配任意一个小写字母 [0-9a-z]:匹配任意一个数字或小写字母 注:不能使用[a-Z],横杠是以ASCII的顺序进行对比,A的ASCII码是65,a的ASCII码是97,顺序只能从小到大. 也不推荐使用[A-z],ASCII码65至122之间除了包含所有大小写字母,还包含6个符号.
- 要匹配两个字符可以使用两个字符组
[0-9][a-zA-Z]:匹配一个数字和一个字母
-
[^]
- 表示取反;如果要在中括号内匹配
^
和-
特殊字符,若没有使用转义符的话,应该将符号放在中括号开头或结尾。
- 表示取反;如果要在中括号内匹配
-
^
- 表示匹配字符串的开头。
-
$
- 匹配字符串的结尾
- ^和$配合使用能约束字符串的位数
^a.$ 表示匹配以a开头,以除换行符外的任意字符结尾的两位字符 ^只能出现在正则表达式开头,$只能出现正则表达式结尾
-
\d
- digit 表示匹配任意一位数字,相当于
[0-9]
- digit 表示匹配任意一位数字,相当于
-
\w
- word 表示匹配所有的数字、字母、下划线,相当于
[0-9a-zA-Z_]
- word 表示匹配所有的数字、字母、下划线,相当于
-
\t
- 匹配tab
-
\n
- 匹配回车
-
\s
- 匹配所有的空白字符,相当于[ \t\n]
-
\D
- 所有非数字
-
\W
- 所有非数字、字母、下划线
-
\S
- 所有非空白字符
-
\b
- 匹配一个单词的结尾
[\d]等同于\d
[\d\D]、[\w\W]、[\s\S] 表示匹配所有
-
.
- 匹配除了换行符的所有单个字符,可以通过配置使
.
包含换行符
- 匹配除了换行符的所有单个字符,可以通过配置使
-
|
- 或
a表达式|b表达式 表示匹配a表达式或b表达式,如果a表达式匹配成功了,就不会匹配b表达式。如果表达式有重叠部分,最好把长的放前面
-
()
- 匹配括号内的表达式,也表示一个组。
空格直接用空格键
匹配。
量词
用来匹配前面的字符出现的次数。
量词 | 含义 |
---|---|
{n} |
表示明确匹配n次。 |
{n,} |
表示至少匹配n次。 |
{n,m} |
表示至少匹配n次,至多m次。 |
? |
表示匹配0次或1次。默认贪婪,也可用作防止贪婪。 |
+ |
表示匹配1次或多次。默认贪婪 |
* |
表示0次或多次。默认贪婪 |
# 例:匹配整数或小数
\d+(\.\d+)?
# 匹配手机号码,第一位为1,第二位为3-9,整体11位
^1[3-9]\d{9}$
转义符\
-
原本有特殊意义的字符,到了表达它本身的意义的时候,需要转义。
-
有一些有特殊意义的内容,放在字符组[ ]中,也会取消它的特殊意义。
[.]
[().*+?]
# 横杠-在字符组中表示范围,如果不希望它表示范围,则需要转义,或者放在字符组的最前面或最后面
# 匹配15位身份证号,1-9开头
[1-9]\d{14}
# 匹配18位身份证号,1-9开头,最后一位为数字或x
[1-9]\d{16}[\dx]
# 匹配15位或18位身份证号,方法一:
^([1-9]\d{16}[\dx]|[1-9]\d{14})$ # 必须将匹配更长的表达式放前面,否则将只能匹配15位身份证号
# 方法二: 两种身份证号格式的前15位是相同规律,后面三位要么都出现,要么都不出现
^[1-9]\d{14}(\d{2}[\dx])?$
贪婪匹配
- 在量词范围允许的情况下默认会尽可能多的匹配内容。
.*x 表示匹配任意字符、任意多次,遇到最后一个x才停下来。
非贪婪(惰性)匹配
- 表示在量词允许的情况下尽可能少的匹配内容。
# 用法: 在量词后面加上问号?
.*?x 表示匹配任意字符、任意多次,但是一遇到x就停下来。
参考文档
https://docs.python.org/zh-cn/3/library/re.html?highlight=re#module-re