通过前面的学习,我们知道调用请求库可以抓取HTML页面,调用美汤库可以解析HTML页面。但是通常一个HTML页面的信息很多,你不可能全部拿走,手动修改,所以需要使用Re正则表达式来提取
通过前面的学习,我们知道调用请求库可以抓取HTML页面,调用美汤库可以解析HTML页面。但是通常一个HTML页面的信息很多,你不可能全部拿走,手动修改,所以需要使用Re正则表达式来提取页面的关键信息。
什么是正则表达式?Re:正则表达式,可以简洁优雅地表达一组字符串。
例如:
"Py""Pyt""Pyth""Pytho""Python"
这几串有什么相似之处?没错,就是都是基于”Py & # 8221开始的时候。
我们用了五行来枚举所有的字符串。如果我们用Re来代替呢?好吧,好吧!
Py(t|th|tho|thon)?N
只是五行串而已。万一是几千行呢?那个正则表达式用起来不是特别爽吗?
“一行胜千言”—正则表达式正则表达式最本质的特征是:简洁、优雅,一行胜千言。
在我看来,就像苹果LOGO一样,周围都是极简的美。
还有一个词:求同存异。
让我们来看看正则表达式的语法:
正如上面所展示的,正则表达式由字符和操作符构成。
如上图所示,正则表达式由字符和运算符组成。
常见运算符
看看正则表达式的一些经典例子:
^[A-Za-z]+$ 由26个字母组成的字符串^-?d+$ 整数形式的字符串[1-9]d{5} 中国境内邮政编码d{3}-d{8}|d{4}-d{7} 国内电话号码
Python中的Re库Python为正则表达式提供了标准的库Re,用来匹配字符串。
调用Re库:
import re
正则表达式的表达式类型:
Re库采用raw string类型表示正则表达式,形式为:r’text’。
例如:r '[1-9]d[5]’
原始字符串类型是本机字符串类型,转义字符不能再次转义。
Re库还可以采用string类型表示正则表达式,更为繁琐,形式为’text’。
例如:“[1-9]\ d { 5 } ’
先前的”是一个转义字符。
当正则表达式包含转义字符时,更推荐使用原始字符串类型。
RE库的基本方法:
先介绍一下Match对象:
匹配对象是一次匹配的结果,包含大量匹配信息。
和response对象一样,Match对象也有一些属性和方法。
像响应对象一样,匹配对象也有一些属性和方法。
Match对象的属性
匹配对象的属性
匹配对象方法
前面已经介绍过如何调用对象的属性和方法了,这里就不再赘述,可以百度做深入了解。
我已经介绍过如何调用对象的属性和方法,这里就不再赘述了。我可以从百度上了解更多关于他们的信息。
Re的六种基本方法
下面重点介绍搜索方法:
re.search(pattern, string, flags=0)
在字符串中搜索匹配正则表达式的第一个位置,并返回一个match对象。
pattern:正则表达式的字符串或者原生字符串表示string:带匹配的字符串flags:正则表达式使用时的控制标记
标志标志值
# 使用search方法匹配字符串match = re.search(r'[1-9]d{5}', 'A100001', flags=re.I)# 匹配成功则返回匹配后的字符串if match: print(match.group(0))
注意:Match对象返回匹配结果,所以匹配返回值是bool变量,所以用条件语句判断。
环库的方法并不太难用。以下是其余方法的总结:
关于。Match (pattern,string,flags = 0)从字符串的开头匹配正则表达式,并返回一个Match对象。
参数同上。
关于。find all (pattern,string,flags = 0)搜索一个字符串,并返回可以匹配为列表类型的所有子字符串。
参数同上。
Re.split (pattern,string,maxsplit = 0,flags = 0)根据正则表达式匹配的结果拆分字符串,并返回列表类型。
maxsplit:最大分割数,剩余部分作为最后一个元素输出
关于。Finder (pattern,string,flags = 0)搜索字符串并返回与结果匹配的迭代类型。每个迭代元素都是一个匹配对象。
参数同上。
for m in re.finditer(r'[1-9]d{5}', 'A100001 B100002'): if m: print(m.group(0))
re sub(pattern,repl,string,count = 0,flags = 0)替换字符串中匹配正则表达式的所有子字符串,并返回被替换的字符串。
repl:替换匹配字符串的字符串count:匹配的最大替换次数sub = re.sub(r'[1-9]d{5}', ',hello', 'A100001 B100002')print(sub)
Re库的等效使用上面解释了Re库的六个基本方法的功能用法,下面介绍另一个等价的面向对象用法:
match = re.search(r'[1-9]d{5}', 'A100001')cmp = re.compile(r'[1-9]d{5}')match = cmp.search('A100001')
第一种是功能用法,一次操作就能完成任务;第二种是面向对象的用法,将字符串形式的正则表达式编译成正则表达式对象,然后进行方法运算。两种方法都有可能,理解就好。
Re库的贪婪匹配机制在实际使用中,我们会遇到如下问题:
match = re.search(r'PY.*N', 'PYANBNCN')
对于这样的字符串,原则上可以返回三个子字符串,即’PYAN & # 8217,’宾’,’PYANBNCN & # 8217。但是当我们调用match.group(0)进行检查时,应该返回哪一个呢?
Re库默认采用贪婪匹配机制,返回匹配中最长的子串,即返回’PYANBNCN & # 8217走吧。
还有一个问题。想输出最短的子串,应该怎么做??
我们只需在操作符后面添加?即可输出最小匹配了:
我们只需要在运算符后面加上?可以输出的最小匹配:
最小匹配
match = re.search(r'PY.*?N', 'PYANBNCN')if match: print(match.group(0))
总结本章解释了Python中正则表达式Re库的入门级用法。正则表达式并不是Python独有的,可以在很多地方使用。学习Re库后,对其他语言和任务也有帮助。