正则匹配括号⾥⾯的内容不包括括号_python正则表达式
是⼀个计算机科学概念⽤于使⽤单个字符串来描述,匹配某个规则的字符串常常⽤来检索,替换某些模式的⽂本
正则的写法
.(点号):表⽰任意⼀个字符,除了
[](中括号),匹配括号中列举的范围,如[0-9]代表任意单个字数,[a-z]代表任意单个⼩写字母
d: 任意⼀个数字
D:除了数字都可以
s:表空格,tab键
S:除了空格,tab键之外
w:单词字符,a-z,A-Z,0-9,_
W:除了字母和数字
*:表⽰前⾯的内容重复零次或者多次
+:表⾯前⾯内容⾄少出现⼀次
:表⾯前⾯的内容出现⼀次或者零次
{m, n} :出现m到n次
^ :匹配字符串的开头
$:匹配字符串的结尾
():对正则表达式的内容进⾏分组,从第⼀个括号开始
A:匹配字符串开始
Z:匹配字符串末尾
|:左右任意⼀个
使⽤⼤致步骤
1. 使⽤compile将表⽰正则的字符串编译为⼀个pattern对象
2. 利⽤Pattern对象提供的⽅法,对⽂本进⾏匹配,获取匹配结果
3. 最后利⽤match对象提供的属性和⽅法后去信息,根据需要进⾏操作
常⽤匹配⽅法
match匹配
必须从第⼀个字符开始就能匹配上,否则匹配失败
返回的结果只有⼀个,并且⽀持group分组
import retext = '1234aash34235235fdosdf'p = repile('[0-9]*')result = p.match(text)print(result)up())print(result.span())"""输出结果1234(0, 4)"""返回结构体re.Match
正则表达式获取括号内容span:表⽰匹配的跨度,从哪⾥匹配,到哪⾥结束,左包括右边不包括
group:表⽰匹配的组,如果只有⼀组则直接打印内容
start:显⽰开始匹配的字符串的位置
end:表⽰结束字符串的位置
groups:当正则⾥⾯出现括号时搭配使⽤
import retext = '1234aash34235235fdosdf'p = repile('([0-9]*)') # 这⾥多了⼀个括号result = p.match(text)print(result)up())ups())p
search匹配
与match基本⼀致,也只返回⼀个结果
但是可以不⽤从开头位置匹配
返回⼀个结果,⽀持group分组
import retext = 'a1234aash34235235fdosdf'p = repile('[0-9]+')result = p.search(text)print(result)up())"""1234"""
findall匹配
匹配所有能匹配到的结果
不⽀持group分组,默认返回⼀个列表
import retext = 'a1234aash34235235fdosdf'p = repile('[0-9]+')result = p.findall(text)print(result)"""['1234', '34235235']"""
finditer匹配
匹配所有能匹配到的结果
默认返回⼀个迭代,由re.Match迭代⽽成,可以通过for循环取出
re.Match⽀持group分组
import retext = 'a1234aash34235235fdosdf'p = repile('[0-9]+')result = p.finditer(text)print(result)for r in result: print(r) up())"""123434235
sub替换
可以⽤sub替换要匹配的字符
sub为批量替换,即可以替换多个位置
import retext = 'a1234aash34235235fdosdf'p = repile('[0-9]+')result = p.sub('0', text) # 把结果全部替换为0print(result)"""a0aash0fdosdf"""
group与groups的区别
group与groups都属于re.Match的内置属性
group⽤于直接显⽰匹配结果,⽽groups⽤于提取匹配结果中的值
以提取百度⽹页title为例
import reimport requestsurl = 'www.baidu'headers = { 'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Geck
可以看出,group直接把整个匹配的结果都提取出来了groups只提取了匹配值中括号的部分,并且需要搭配()括号使⽤并且group的结果是
⼀个字符串,⽽groups的结果是⼀个tuple如果存在多个组的时候,两个结果更不相同
import retext = '2020-04-05'p = repile('([0-9]{4})-([0-9]{2})') # 这⾥分了两个组,⼀组提取年份,⼀组提取⽉份result = p.search(text)print(result)
可以看出,group和groups⾥⾯是否加零结果都是⼀样的,即返回所有组group可以指定返回第⼏组的值,相对来说更好筛选groups直接
返回匹配的所有值根据这⾥特性,我们可以重新使⽤group对上⾯的百度标题进⾏爬取
import reimport requestsurl = 'www.baidu'headers = { 'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Geck
正则表达式修饰符
re.I演⽰
假设想要匹配所有字母,不区分⼤⼩写
import retext1 = 'shdfi1234SHDFISHDI'p = repile('[a-z]+', re.I) # 不区分⼤⼩写,所有字母都匹配result = p.findall(text1)print(result)"""['shdfi', 'SHDFISHDI']"""
re.M演⽰
假设匹配以sh开头以2结尾的字符串
import retext1 = 'sh22dfi1234SHDFIssSHDI'p = repile('^sh.*2$', re.M) # 匹配多⾏,即忽略回车匹配所有⼩写字母p2 = repile('^sh.*2$')result = p.findall(text
可以看出,在多⾏模式下,⼀个字符串根据回车符号被拆分成两⾏,即有两个开头与结尾。
re.S演⽰
假设匹配⼀个d..I的字符串
import retext1 = 'sh22dfi1234SHDFIssSHDI'p1 = repile('d.*I')p2 = repile('d.*I', re.S) # 让点
号也能匹配换⾏符result1 = p1.search(text1)result2 = p2.searc 匹配中⽂
匹配中⽂[⼀-龥],不包括全⾓标点
贪婪匹配与⾮贪婪匹配
. *和.*?
import retext = '12ddd345'# 匹配⼀个数字开头数字结尾的字符串p1 = repile('[0-9].*[0-9]') # 贪婪模式p2 = repile('[0-9].*?[0-9]') # ⾮贪婪模式result1 = p1.
正则表达式默认使⽤贪婪匹配
import retext = u'123你好bbabd'p1 = repile(u'[⼀-龥]{1,2}') # 匹配⼀个或者两个中⽂result1 = p1.search(text)up()) # 打印结果是匹配两个"""你
如果使⽤⾮贪婪匹配
import retext = u'123你好bbabd'p1 = repile(u'[⼀-龥].*?') # 匹配⼀个或者两个中⽂result1 = p1.search(text)up()) # 打印结果是匹配⼀个"""你"""
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论