#10 Python爬虫的进阶之路---HTML解析正则表达式

本文深入解析正则表达式的各种元素,包括元字符、转义、重复限定符、字符集合、分支条件、反义、括号分组、零宽断言、贪婪与懒惰模式。同时介绍了Python中如何使用正则表达式进行字符串处理,包括匹配、搜索、替换、分组等功能。

元字符

\b是一个常用的元字符,他代表一个位置,用于指示单词的开始或结束。如我们想要寻找we,忽略大小写我们可能匹配到we,We,Welcome等位置,而\bwe\b则限定了寻找we而不是一个单词中的一部分。
如果我们想要匹配两个单词之间的所有字符呢?可以使用以下方法:\bwe\b.*\bus\b实现了匹配we与us之间的所有字符。其中.表示除换行符外的任意字符,*表示任意长度。
在这里插入图片描述
举例:文本we need to study in all our life,l3000,我们想获取以s开头的所有单词,可以使用如下正则式\bs\w*\b,如果我们要匹配l3000这样的字符串,应该使用^l\d*$

字符转义

如果我们需要匹配元字符,则需要在元字符前加上转义字符\,如我们要匹配ftp:\127.0.0.1时,应写为ftp:\\\\127\.0\.0\.1

重复限定符

在这里插入图片描述

字符集合

如要匹配比元字符更加限制的字符集合,则需要自定义字符集合。如在只考虑英文的情况下\w等价于[a-z0-9A-Z_]

分支条件

|或符表示分支,匹配时从左到右的正则式依次匹配,遇到相符正则式即停止

反义

在这里插入图片描述

括号分组

在正则式中,一个括号被认为是一个分组,从左到右第n组默认分配分组名n,如正则式((\d{1,3})\.){3}\d{1,3}可改写为((\d{1,3})\.){3}\2
自定义分组名,将\d+定义为Digit,可以使用(?<Digit>\d+)(?'Digit'\d+),反向引用则使用\k<Digit>
在这里插入图片描述

零宽断言

(?=exp)表示匹配到exp后取其前面的字符串;如we are cooking and singing使用[a-z]*(?=ing)匹配出cooksing。单词反向匹配。
(?<=exp)表示匹配到exp后取其后面的字符串。从最左端匹配断言
(?!exp)表示此位置后不能跟exp,如\b((?!abc)\w)+\b 会在abc123 sddefsd123中匹配sddefsd123
(?<!exp)此位置前面不含exp

贪婪与懒惰

正则式匹配一般默认为贪婪模式,尽可能多的匹配,如在a23b73b中使用a\w*b会匹配整个字符串,若只想匹配少量子串可使用懒惰模式
在这里插入图片描述

Python与正则

在这里插入图片描述
Python中可以支持原生字符串\\\\可记为r'\\'.

import re

#首先使用compile生成对应正则式的pattern参数
pattern = re.compile(r'\d+')


#match 
res = re.match(pattern,'326328wyegfwef')
print(res.group())
res = re.match(pattern,'c326328wyegfwef')
if res:
    print(res.group())
else:
    print("fail match")


#为了将捕获对象表示出来,使用了Match对象,以p和match为例
p = re.compile(r'(\w+) (\w+) (?P<word>.*)')
match = p.match('I Love You!')

print("match.string:",match.string)                            #需要匹配的文本
print("match.re",match.re)                                     #正则式
print("match.pos:",match.pos)                                  #匹配串的起始位置
print("match.endpos:",match.endpos)                            #匹配串的终止位置
print("match.lastindex:",match.lastindex)                      #匹配的最后一个分组索引
print("match.lastgroup:",match.lastgroup)                      #匹配的最后一个分组名

print("match.group(0):",match.group(0))                        #匹配的所有分组实体
print("match.group(1,2):",match.group(1,2))                    #匹配的第一第二分组实体
print("match.groups():",match.groups())                        #分组元组
print("match.groupdict():",match.groupdict())                  #有分组名的以字典形式表示
print("match.start(2):",match.start(2))                        #第二个分组在字符串中的开始位置
print("match.end(2):",match.end(2))
print("match.span(2):",match.span(2))                          
print(r"match.expand(r'\2 \1 \3'):",match.expand(r'\2 \1 \3')) #原字符串分组后按expand中的新规则更改后给出对应值

#其他函数
pattern.search('sns8723sjdf8w38')   #搜寻第一个为数字的序列返回match对象
pattern.split('sns8723sjdf8w38')    #按数字序列分开字符串以列表形式返回
pattern.findall('sns8723sjdf8w38')  #找到所有数字序列子串以列表形式返回
pattern.finditer('sns8723sjdf8w38') #找到所有数字序列以迭代器的形式返回所有match对象
pattern.sub(r'0','sns8723sjdf8w38') #利用r‘0’替换字符串中所有匹配的子串并返回字符串
326328
fail match
match.string: I Love You!
match.re re.compile('(\\w+) (\\w+) (?P<word>.*)')
match.pos: 0
match.endpos: 11
match.lastindex: 3
match.lastgroup: word
match.group(0): I Love You!
match.group(1,2): ('I', 'Love')
match.groups(): ('I', 'Love', 'You!')
match.groupdict(): {'word': 'You!'}
match.start(2): 2
match.end(2): 6
match.span(2): (2, 6)
match.expand(r'\2 \1 \3'): Love I You!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值