1. 导入正则表达式
import re
2.正则表达式规则
2.1 单字符匹配
规则 功能
. 匹配任意1个字符(除\n)
[] 匹配[]中列举的字符
\d 匹配数字, 0-9
\D 匹配非数字
\s 匹配空白符, 空格, Tab键
\S 匹配非空白符
\w 匹配单词字符,a-z,A-Z,0-9,_
\W 匹配非单词字符
2.2 匹配数量
规则 功能
* 匹配前一个字符出现0次多次或无限次,可有可无
+ 匹配前一个字符出现1次多次或无限次,至少得出现一次
? 匹配前一个字符出现1次或者0次,至多出现1次
{m} 匹配前一个字符出现m次
{m,} 匹配前一个字符至少出现m次
{m,n} 匹配前一个字符至少出现m次,至多出现n次
2.3 边界条件
规则 功能
^ 匹配字符串开头
$ 匹配字符串结尾
\b 匹配一个单词的边界
\B 匹配非单词边界
pattern = r"^\w+\s\b\world\b\s!$" 匹配hello world ! 但是不匹配helloworld !
2.4 匹配分组
规则 功能
| 匹配左右任意一个表达式
(ab) 将括号中字符作为一个分组
\num 引用分组num匹配到的字符串
(?P<name>) 分组起别名
(?P=name) 引用别名为name分组匹配到的字符串
例子一:
匹配出0-100之间的数字
pattern = r"0$|100$|[1-9]\d{0,1}$"
例子二:
匹配分组,获取页面中<h1>标签的内容
pattern = r"<h1>(.*)</h1> #str="<h1>hello world!</h1>"
测试一下re.groups(), re.group(), re.group(1)的区别
例子三
分组引用,精确获取多个标签内的内容
pattern = r"<(.+)><(.+)>.*</\2></\1>" #str="<span><h1>hello world!</h1></span>"
例子四
分组起别名
pattern = r"<(?P<key1>.+)><(?P<key2>.+)>(?P<nr>.*)</(?P=key2)></(?P=key1)>" #str="<span><h1>hello world!</h1></span>"
3. 使用的方法
方法一:
re.match(pattern, string[, flags])
pattern: 匹配的正则表达式
string: 要匹配的字符串
flags: 标志位,用于控制正则表达式的匹配方式,如:是否区分大小写
返回match对象:
使用group(), groups(), groupdict()获取匹配表达式
group([group1, ... ]):获取一个或多个分组截获的字符串,指定多个参数时以元组形式返回,编号0代表整个匹配的子串;不填写参数时,返回group(0),可以用别名也可以用编号。
没有截获字符串的组返回None;截获多次的组返回最后一次截获的子串
groups(): 以元组形式返回全部分组截获的字符串
groupdict():返回以有别名的组的别名为键,以改组截获的子串为值的字典。没有别名的组不包含在内。
方法二:
re.search(pattern, string, flags=0)
pattern: 匹配的正则表达式
string: 要匹配的字符
flags: 标志位,用于控制正则表达式的匹配方式。如:是否区分大小写,多行匹配等
re.search()方法扫描整个字符串,并返回第一个成功的匹配,如果匹配失败,则返回None
与re.match()方法不同,re.match()方法要求必须从字符串的开头进行匹配,如果字符串的开头不匹配,整个匹配就失败了;re.search()并不要求必须从字符串的开头进行匹配
方法三:
re.sub(pattern, repl, string, count=0, flag=0)
pattern: 正则表达式
repl: 被替换的内容
string: 正则表达式匹配的内容
count: 正则表达式匹配的结果是多个,使用count来限定替换的个数从左向右,默认值是0,替换所有的匹配到的结果
flags: 匹配模式,可以使用按位或者“|”标识同时生效。
方法四:
re.findall(pattern, string, flags=0)
re.findall()在字符串中找到正则表达式所匹配的所有子串,并返回一个列表;如果没有找到匹配的,则返回空列表;
方法五:
re.split(pattern, string, maxsplit=0)