正则表达式
知识点
匹配单个字符
字符 | 功能 |
---|---|
. | 匹配任意一个字符,除了\n |
[] | 匹配括号中列举的字符,如:[abc]、[a-z] |
\d | 匹配数字0-9 |
\D | 匹配非数字的部分 |
\s | 匹配空白字符,即空格、tab |
\S | 匹配非空白字符 |
\w | 匹配单词字符,即a-z、A-Z、0-9、中文字符 |
\W | 匹配非单词字符 |
注意点:
点号(.)本身是不支持检测换行符的,但是可以通过追加re.S参数来实现支持匹配换行,如下:
1 | import re |
匹配多个字符
字符 | 功能 |
---|---|
* | 匹配前一个字符0次或者无限次,即可有可无 |
+ | 匹配前一个字符1次或者无限次,即至少有一次 |
? | 匹配前一个字符0次或者1次,即要么有一次,要么0次 |
{m} | 匹配前一个字符出现m次 |
{m,n} | 匹配一个字符出现m到n次 |
匹配开头结尾
字符 | 功能 |
---|---|
^ | 匹配字符串开头 |
$ | 匹配字符串结尾 |
匹配分组
字符 | 功能 |
---|---|
| | 匹配左右任意一个字符,可以用括号限定分隔号作用的范围,如:\d+@(126|163)\.com |
(ab) | 将括号中字符串作为一个分组,之后可以用group(num)将分组中匹配的字符串打印出来 |
\num | 引用分组num匹配到的字符串 |
(?P<name>) | 给分组起别名,便于正则表达式后面的调用,如:^http:(?P<p1>\w*)wow(?P=p1)$ |
(?P=name) | 引用别名name分组匹配到的字符串 |
注意点:
一般情况下利用(ab)、\num方式就可以适用分组匹配的结果了,除非是超级长的正则表达式
便于理解,现下举例描述:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15import re
str_list = ['shuai@126.com', 'test@163.com', '<h1>qwer</h1>']
# match方法用于匹配索要所有的字符串中是否有符合正则规则的内容,有则返回字符串对象,没有则返回None
# 利用括号限制分隔符的作用范围
ret = re.match(r'([a-z]*)@(126|163)\.com', str_list[0])
# 利用group可以打印出匹配的字符串
print(ret.group())
print(ret.group(1)) # 利用group(num)可以打印出指定括号中匹配的数据, 此处打印[a-z]*匹配的内容
# 利用括号设置分组, 如下\1表示的是第一个括号中\w匹配的字符内容
ret = re.match(r'^<(\w)>[a-z]+</\1>$', str_list[2])
# 利用起别名的方式,同样可以实现分组
ret = re.match(r'^<(?P<p1>\w)>[a-z]+</(?P=p1)>$', str_list[2])常见函数
re.search
作用:
可以在文章中搜索正则匹配的内容,一旦匹配,即返回第一次匹配的文字对象
格式:
re.search(正则表达式, 匹配字符串)
示例:
1
2
3
4
5import re
string = '阅读数:999,转载数:888'
ret = re.search(r'\d+', string) # 只会匹配999,不会匹配888
print(ret.group()) # 无法适用group(num)返回对应的匹配值
re.findall
作用:
匹配字符串中所有符合正则的内容,匹配则返回匹配内容的列表,无匹配则返回空列表
格式:
re.findall(正则表达式, 匹配字符串)
示例:
1
2
3
4
5import re
string = '阅读数:999,转载数:888'
ret = re.findall(r'\d+', string) # 不仅匹配999,还匹配888
print(ret) # 返回值是一个列表
re.sub
作用:
用指定文本替换正则表达式匹配的文本内容,替换成功后返回对应的字符串
格式:
re.sub(正则表达式, 替换文本/文本处理函数, 字符串内容)
示例:
1
2
3
4
5
6
7
8
9
10
11
12
13import re
def change_str(temp):
strnum = temp.group()
num = int(strnum) + 1
return str(num)
string = '阅读数:999,转载数:888'
# 利用change_str函数将字符串中所有符合正则的内容进行了转换,并替换掉
ret = re.sub(r'\d+', change_str, string)
# 也可直接用字符串替换
# ret = re.sub(r'\d+', "devin", string)
print(ret) # 返回值是一个转换后的字符
re.split()
作用
按照正则表达式将字符串进行切割,最后返回切割后的列表
格式
re.split(正则表达式, 字符串)
示例
1
2
3
4
5import re
string = '阅读数:999,转载数:888'
ret = re.split(r':| ', string)
print(ret)
作业
- (问答)正则表达式中点号(.)本身是不支持检测换行符的,如何设置让其能够匹配换行符
- 现有字符串shuai@126.com,请利用match和group的方法提取出其中字符shuai
- (问答)在正则中可以用起别名的方式简化正则表达式中成对出现的字符,如何实现正则表达式的起别名
- 现有字符串shuai@126.com,请利用search匹配出其中字符126,并将信息打印出来
- 现有字符’阅读数:999,转载数:888’,请利用findall匹配出其中所有的字符串信息,并将其打印出来
- 现有字符’阅读数:999,转载数:888’,请利用sub方法,将其中所有的数字全部+1后,将修改后的字符串信息打印出出
- 现有字符‘shuai@126.com’,请利用正则将字符串按@和.进行分割成列表,然后将信息打印出来