正则表达式
符号 | 功能说明 |
---|---|
\d | 匹配1个数字字符 |
\w | 匹配1个字母、数字或下画线字符 |
\s | 匹配1个空白字符,如换行符、制表符、普通空格等 |
\S | 匹配1个非空白字符 |
\n | 匹配1个换行符,相当于按1次Enter键 |
\t | 匹配1个制表符,相当于按1次Tab键 |
. | 匹配1个任意字符,换行符除外 |
* | 匹配0个或多个表达式 |
+ | 匹配1个或多个表达式 |
? | 非贪婪限定符,常与.和*配合使用 |
() | 匹配括号内的表达式,也表示一个组 |
[] | 使中括号里的内容不再有特殊含义 |
- (.*?)
用于获取文本A与文本B之间的内容,并不需要知道他的确切长度及格式,但是需要知道它在哪两个内容之间,其使用格式如下所示:
文本A(.*?)文本B
下面结合findall()函数和非贪婪匹配(.*?)进行文本提取的演示,代码如下:
import re
res='文本A百度新闻文本B,新闻标题文本A新浪财经文本B,文本A搜狗新闻文本B新闻地址'
p_source='文本A(.*?)文本B'
source=re.findall(p_source,res)
print(source)
上述代码获得所有符合’文本A(.*?)文本B’匹配规则的内容列表,运行结果如下:
['百度新闻','新浪财经','搜狗新闻']
- .*?
用于代替文本C和文本D之间的所有内容。之所以要使用.*?,是因为文本C与文本D之间的内容经常变动或没有规律,无法写到匹配规则里;或者文本C与文本D之间的内容较多,不想写到匹配规则里。使用格式如下:
文本C.*?文本D
演示代码如下:
import re
res='<h3>文本C<变化的网址>文本D,新闻标题</h3>'
p_source='<h3>文本C.*?文本D(.*?)</h3>'
source=re.findall(p_source,res)
print(source)
运行结果如下:
['新闻标题']
- 自动考虑换行的修饰符re.S
使用格式如下:
re.findall(匹配规则,原始文本,re.S)
演示代码如下:
import re
res='''文本A
百度新闻文本B'''
p_source='文本A(.*?)文本B'
source=re.findall(p_source,res,re.S)
print(source) #由于文本A和文本B之间有换行,如果在findall后的括号中不写re.S,则获取不到内容,因为(.*?)匹配不了换行
运行结果:
['百度新闻']
- 知识点补充
其格式如下:re.sub(需要替换的内容,替换值,原字符串)。
演示代码如下:
title=['<em>你好</em>']
title[0]=re.sub('<em>','',title[0])
print(title[0])
运行结果:
你好