1、正则表达式的基本语法
普通字符
1、判断一个长度为 1 的字符串是否为数字。
[] 表示这是一个字符组,表示匹配包含的任意一个字符
[0123456789]
2、如果 [] 中的字符是连续的,就可以使用 - 省略中间的字符。
[0-9]
、[a-z]
、[A-Z]
3、判断长度为 2 的字符串包含的是否是数字,可以使用==两个 []==进行判断
[0-9][0-9]
4、匹配包括所有英文大小写
[a-zA-Z]
或[A-Za-z]
元字符
元字符是正则表达式中有特殊含义的字符
元字符 说明 .
匹配除换行符以外的任意字符 \
转义字符,可以解除特殊字符的特殊功能 ^
匹配字符串开始的位置 $
匹配字符串结束的位置 *
匹配前面的字符 0 次或多次 +
匹配前面的字符 1 次或多次 ?
匹配前面的字符 0 次或 1 次 {n}
匹配前面的字符 n 次 {n.}
匹配前面的字符至少 n 次 {n,m}
匹配前面的字符至少 n 次,至多 m 次 `x y` [xyz]
匹配 xyz 中任意一个字符 [^xyz]
不匹配 xyz 中的字符 [^m-z]
匹配未在指定范围 m 到 z 中的任何字符 \A
只匹配字符串的开头 \B
匹配非单词边界 \b
匹配某个单词边界 \D
匹配非数字字符 \d
匹配数字字符 \f
匹配换页字符 \n
匹配换行符 \r
匹配回车字符 \S
匹配任何非空白字符 \s
匹配任何空白字符,包括空格、制表符等 \W
匹配任何非单词字符 \w
匹配任何单词字符,包括数字和下划线 \Z
只匹配字符串结尾或结尾的换行符之前 \z
只匹配字符串的结尾
- 默认情况下,
^
与\A
的功能相同,$
与\Z
的功能相同,但是如果设置了re.MUKTILINE
的标志,^
和$
还可以匹配换行符的位置,而两外两个不可以。- 除此之外,() 可以起到分组作用,() 中包含的是正则表达式的子表达式
转义字符
1、匹配一个 IP 地址:
[1-9]{1,3}\.[0-9]{1,3}\.[0-9]{3}\.[0-9]{1,3}
2、如果想要匹配\
,则需要使用\\
。简化:在字符串左侧加上 r 前缀
限定符
限定数量的字符,用来限定一个目标表达式要重复出现几次才会匹配成功
即上表中的 *、+、?、{n}、{n,}、{n,m}......
e.g.:获取 9 位QQ号:
^\d{9}$
定位符
表示字符串或某个单词的边界
即上表中的 ^、$、\B、\b
2、正则表达式和 re 模块
在使用 re 模块前,需要通过 import 引入:
import re
compile 方法
如果重复使用某个正则表达式,,可以使用 compile() 方法将正则表达式编译成 Pattern 对象
re.compile(pattern[,flag])
- pattern:字符串形式的正则表达式
- flag:可选参数,表示匹配模式
- re.I ( re.IGNORECASE ):忽略大小写匹配
- re.M ( re.MULTILINE ):多行模式
- re.S ( re.DOTALL ):点(.) 任意匹配模式,会改变 . 的匹配方式,可以匹配任意字符
- re.X ( re.VERBOSE ):详细模式,该模式下的正则表达式可以是多行的,也可以添加注释,空白符号会被忽略。
re.compile() 方法返回一个正则表达式的对象
pythonimport re pattern = re.compile(r"""\d+ # 匹配数字整数部分 . # 匹配数字小数点 \d* #匹配数字小数部分""", re.X)
match 方法
match 方法只对字符串匹配一次,只要在起始位置匹配到一个符合要求的字符就会返回值,并不会返回所有符合的结果
match(pattern, string, flags)
- pattern:字符串形式的正则表达式
- string:要匹配的字符串
- flags:可选参数,表示匹配模式
search 方法
search() 方法的语法格式与 match() 方法相同
search() 方法不仅在字符串的起始位置进行搜索匹配,也会在符合条件的其他位置进行匹配
findall 方法
用于在整个字符串中搜索所有符合正则表达式的字符串
匹配成功的结果以列表的形式返回
基本语法与 match() 方法相同
sub 方法
可以使用正则表达式替换字符串
sub(pattern, rep1, string, count, flags)
- pattern:字符串形式的正则表达式
- rep1:用来替换的字符串
- string:表示原始字符串
- count:可选参数,表示模式匹配后替换的最大次数(默认值为 0 表示替换所有匹配到的字符串)
- flags:可选参数,标志位,用于控制匹配方式
split 方法
通过正则表达式分割字符串,并以列表的形式返回
split(pattern, string, maxsplit, flags)
- pattern:字符串形式的正则表达式
- string:表示原始字符串
- maxsplit:可选参数,表示最大的拆分次数
- flags:可选参数,标志位,用于控制匹配方式
e.g.:分隔 URL 的 /:
pythonimport re pattern = r'[\/]+' url = 'https://docs.python.org/zh-cn/3' rules = re.split(pattern, url) print(rules)
3、正则表达式拓展
贪婪匹配和非贪婪匹配
使用 group() 和 groups() 方法获取分组的内容。
group(N) 用于返回第 N 组括号匹配的字符
groups() 用于返回所有括号匹配的字符,并以元组形式返回
贪婪匹配指限定符尽可能多地匹配字符串,正则表达式默认情况下启用贪婪匹配。
非贪婪匹配则相反,在限定符后买你加上 ? 表示非贪婪匹配。
常用的正则表达式
- 匹配首空白字符:
^\s|\s$
- 匹配日期格式:
^\d{4}-\d{1,2}-\d{1,2}$
- 匹配有效的月份:
^(0?[1-9]|1[0-2])$
- 匹配有效的日期:
^(0?[1-9]|((1|2)[0-9])|30|31)$
- 匹配固定电话号码:
^(\d{3,4}-)?\d{7,8}$
- 匹配身份证号码:
^((\d{18})|([0-9x]{18})|([0-9X]{18}))$
- 匹配 URL:
^(https:\/\/)?([\da-z.-]+)\.([a-z.]{2,6})([\/\w .-])\/?$
- 匹配用户名:
^[a-zA-Z][a-zA-Z0-9_]{4,15}
- ......