爬虫(六)正则表达式

0.正则表达式的概念

是用来简洁表达一组字符串的表达式,用于表达文本类型的特征、同时查找或替换一组字符串、匹配字符串的全部或全部(最主要应用在字符串匹配中)。

编译:将符合正则表达式语法的字符串转换成正则表达式特征。如下:

regex='P(Y|YT|YTH|YTHO)?N'
p=re.compile(regex)
#特征p

1.正则表达式的语法

(1)正则表达式的常用操作符

(2)正则表达式语法实例

(3)经典正则表达式实例

(4)匹配IP地址的正则表达式

IP地址字符串形式的正则表达式(IP地址分4段,每段0-255)

1

2.Re库的基本使用

Re库是python的标准库,主要用于字符串匹配。

import re

(1)正则表达式的表示类型

raw string 类型(原生字符串类型):re库采用raw string类型表示正则表达式,表示为 r'text'

raw string是不包含对转义符再次转义的字符串。例如:

r'[1-9]\d{5}'   #中国大陆的邮政编码
r'\d{3}-\d{8}|\d{4}-\d{7}' #国内电话号码

re库也可以采用string类型表示正则表达式,但更繁琐,(建议:当正则表达式包含转义符时,使用raw string)例如(表示一个斜杠要写写出两个斜杠):

'[1-9]\\d{5}'
'\\d{3}-\\d{8}|\\d{4}-\\d{7}'

(2)Re库的主要功能函数

>>> import re
>>> match=re.search(r'[1-9]\d{5}','BIT 100081')
>>> if match:
	print(match.group(0))

100081

>>> match=re.match(r'[1-9]\d{5}','BIT 100081')
>>> if match:
	print(match.group(0))

>>> match.group(0)
Traceback (most recent call last):
  File "<pyshell#21>", line 1, in <module>
    match.group(0)
AttributeError: 'NoneType' object has no attribute 'group'
>>> match=re.search(r'[1-9]\d{5}','100081 BIT')
>>> if match:
	print(match.group(0))

100081

>>> import re
>>> ls=re.findall(r'[1-9]\d{5}','BIT100081 TSU100084')
>>> ls
['100081', '100084']

>>> re.split(r'[1-9]\d{5}','BIT100081 TSU100084')
['BIT', ' TSU', '']
>>> re.split(r'[1-9]\d{5}','BIT100081 TSU100084',maxsplit=1)
['BIT', ' TSU100084']

>>> for m in re.finditer(r'[1-9]\d{5}','BIT100081 TSU100084'):
	if m:
		print(m.group(0))

100081
100084

>>> import re
>>> re.sub(r'[1-9]\d{5}',':zipcode','BIT100081 TUS100084')
'BIT:zipcode TUS:zipcode'

Re库的另一种等价用法:

3.Re库的 match对象

Match对象是一次匹配的结果,包含匹配的很多信息。

1

Match对象的属性

Match对象的方法

Match对象实例

>>> m=re.search(r'[1-9]\d{5}','BIT100081 TUS100084')
>>> m.string
'BIT100081 TUS100084'
>>> m.re
re.compile('[1-9]\\d{5}')
>>> m.pos
0
>>> m.endpos
19
>>> m.group(0)
'100081'
>>> m.start()
3
>>> m.end()
9
>>> m.span()
(3, 9)

4.Re库的贪婪匹配和最小匹配

Re库默认采用贪婪匹配,即输出匹配最长的子串。

>>> match=re.search(r'PY.*N','PYANBNCNDN')
>>> match.group(0)
'PYANBNCNDN'

如果要输出最短的子串:

>>> match=re.search(r'PY.*?N','PYANBNCNDN')
>>> match.group(0)
'PYAN'

最小匹配操作符

只要长度输出可能不同的,都可以通过在操作符后增加?变成最小匹配。

5.单元小结

发布了219 篇原创文章 · 获赞 13 · 访问量 9798

猜你喜欢

转载自blog.csdn.net/qq_35812205/article/details/104275537