Python网络爬虫七Python中的正则表达式教程Word格式.docx
- 文档编号:5270087
- 上传时间:2023-05-04
- 格式:DOCX
- 页数:18
- 大小:143.87KB
Python网络爬虫七Python中的正则表达式教程Word格式.docx
《Python网络爬虫七Python中的正则表达式教程Word格式.docx》由会员分享,可在线阅读,更多相关《Python网络爬虫七Python中的正则表达式教程Word格式.docx(18页珍藏版)》请在冰点文库上搜索。
Compile
Python通过re模块提供对正则表达式的支持。
使用re的一般步骤是:
Step1:
先将正则表达式的字符串形式编译为Pattern实例。
Step2:
然后使用Pattern实例处理文本并获得匹配结果(一个Match实例)。
Step3:
最后使用Match实例获得信息,进行其他的操作。
我们新建一个re01.py来试验一下re的应用:
[python]
viewplaincopy
1.#
-*-
coding:
utf-8
2.#一个简单的re实例,匹配字符串中的hello字符串
3.
4.#导入re模块
5.import
re
6.
7.#
将正则表达式编译成Pattern对象,注意hello前面的r的意思是“原生字符串”
8.pattern
=
pile(r'
hello'
)
9.
10.#
使用Pattern匹配文本,获得匹配结果,无法匹配时将返回None
11.match1
pattern.match('
hello
world!
'
12.match2
helloo
13.match3
helllo
14.
15.#如果match1匹配成功
16.if
match1:
17.
#
使用Match获得分组信息
18.
match1.group()
19.else:
20.
match1匹配失败!
21.
22.
23.#如果match2匹配成功
24.if
match2:
25.
26.
match2.group()
27.else:
28.
match2匹配失败!
29.
30.
31.#如果match3匹配成功
32.if
match3:
33.
34.
match3.group()
35.else:
36.
match3匹配失败!
可以看到控制台输出了匹配的三个结果:
下面来具体看看代码中的关键方法。
★pile(strPattern[,flag]):
这个方法是Pattern类的工厂方法,用于将字符串形式的正则表达式编译为Pattern对象。
第二个参数flag是匹配模式,取值可以使用按位或运算符'
|'
表示同时生效,比如re.I|re.M。
另外,你也可以在regex字符串中指定模式,
比如pile('
pattern'
re.I|re.M)与pile('
(?
im)pattern'
)是等价的。
可选值有:
re.I(全拼:
IGNORECASE):
忽略大小写(括号内是完整写法,下同)
∙
re.M(全拼:
MULTILINE):
多行模式,改变'
^'
和'
$'
的行为(参见上图)
re.S(全拼:
DOTALL):
点任意匹配模式,改变'
.'
的行为
re.L(全拼:
LOCALE):
使预定字符类\w\W\b\B\s\S取决于当前区域设定
re.U(全拼:
UNICODE):
使预定字符类\w\W\b\B\s\S\d\D取决于unicode定义的字符属性
re.X(全拼:
VERBOSE):
详细模式。
这个模式下正则表达式可以是多行,忽略空白字符,并可以加入注释。
以下两个正则表达式是等价的:
2.#两个等价的re匹配,匹配一个小数
3.import
4.
5.a
pile(r"
\d
+
the
integral
part
\.
decimal
point
7.
*
some
fractional
digits"
re.X)
8.
9.b
\d+\.\d*"
10.
11.match11
a.match('
3.1415'
12.match12
33'
13.match21
b.match('
14.match22
15.
match11:
match11.group()
u'
match11不是小数'
22.if
match12:
23.
24.
match12.group()
25.else:
match12不是小数'
27.
28.if
match21:
match21.group()
31.else:
32.
match21不是小数'
34.if
match22:
35.
match22.group()
37.else:
38.
match22不是小数'
re提供了众多模块方法用于完成正则表达式的功能。
这些方法可以使用Pattern实例的相应方法替代,唯一的好处是少写一行pile()代码,
但同时也无法复用编译后的Pattern对象。
这些方法将在Pattern类的实例方法部分一起介绍。
如一开始的hello实例可以简写为:
[html]
5.m
re.match(r'
6.print
m.group()
re模块还提供了一个方法escape(string),用于将string中的正则表达式元字符如*/+/?
等之前加上转义符再返回
2.2.Match
Match对象是一次匹配的结果,包含了很多关于此次匹配的信息,可以使用Match提供的可读属性或方法来获取这些信息。
属性:
1.string:
匹配时使用的文本。
2.re:
匹配时使用的Pattern对象。
3.pos:
文本中正则表达式开始搜索的索引。
值与Pattern.match()和Pattern.seach()方法的同名参数相同。
4.endpos:
文本中正则表达式结束搜索的索引。
5.lastindex:
最后一个被捕获的分组在文本中的索引。
如果没有被捕获的分组,将为None。
6.lastgroup:
最后一个被捕获的分组的别名。
如果这个分组没有别名或者没有被捕获的分组,将为None。
方法:
1.group([group1,…]):
获得一个或多个分组截获的字符串;
指定多个参数时将以元组形式返回。
group1可以使用编号也可以使用别名;
编号0代表整个匹配的子串;
不填写参数时,返回group(0);
没有截获字符串的组返回None;
截获了多次的组返回最后一次截获的子串。
2.groups([default]):
以元组形式返回全部分组截获的字符串。
相当于调用group(1,2,…last)。
default表示没有截获字符串的组以这个值替代,默认为None。
3.groupdict([default]):
返回以有别名的组的别名为键、以该组截获的子串为值的字典,没有别名的组不包含在内。
default含义同上。
4.start([group]):
返回指定的组截获的子串在string中的起始索引(子串第一个字符的索引)。
group默认值为0。
5.end([group]):
返回指定的组截获的子串在string中的结束索引(子串最后一个字符的索引+1)。
6.span([group]):
返回(start(group),end(group))。
7.expand(template):
将匹配到的分组代入template中然后返回。
template中可以使用\id或\g<
id>
、\g<
name>
引用分组,但不能使用编号0。
\id与\g<
是等价的;
但\10将被认为是第10个分组,如果你想表达\1之后是字符'
0'
,只能使用\g<
1>
0。
下面来用一个py实例输出所有的内容加深理解:
2.#一个简单的match实例
4.import
5.#
匹配如下内容:
单词+空格+单词+任意字符
6.m
(\w+)
(\w+)(?
P<
sign>
.*)'
8.print
m.string:
m.string
9.print
m.re:
m.re
10.print
m.pos:
m.pos
11.print
m.endpos:
m.endpos
12.print
m.lastindex:
m.lastindex
13.print
m.lastgroup:
m.lastgroup
15.print
m.group():
16.print
m.group(1,2):
m.group(1,
2)
17.print
m.groups():
m.groups()
18.print
m.groupdict():
m.groupdict()
19.print
m.start
(2):
m.start
(2)
20.print
m.end
(2):
m.end
(2)
21.print
m.span
(2):
m.span
(2)
22.print
r"
m.expand(r'
\g<
2>
3>
):
\2
\1\3'
24.###
output
###
25.#
26.#
<
_sre.SRE_Pattern
object
at
0x016E1A38>
27.#
0
28.#
12
29.#
3
30.#
sign
31.#
('
world'
32.#
!
33.#
{'
sign'
:
}
34.#
6
35.#
11
36.#
(6,
11)
37.#
world
hello!
2.3.Pattern
Pattern对象是一个编译好的正则表达式,通过Pattern提供的一系列方法可以对文本进行匹配查找。
Pattern不能直接实例化,必须使用pile()进行构造,也就是pile()返回的对象。
Pattern提供了几个可读属性用于获取表达式的相关信息:
1.pattern:
编译时用的表达式字符串。
2.flags:
编译时用的匹配模式。
数字形式。
3.groups:
表达式中分组的数量。
4.groupindex:
以表达式中有别名的组的别名为键、以该组对应的编号为值的字典,没有别名的组不包含在内。
可以用下面这个例子查看pattern的属性:
2.#一个简单的pattern实例
5.p
re.DOTALL)
7.print
p.pattern:
p.pattern
p.flags:
p.flags
p.groups:
p.groups
p.groupindex:
p.groupindex
11.
12.###
13.#
.*)
14.#
16
15.#
16.#
3}
下面重点介绍一下pattern的实例方法及其使用。
1.match
match(string[,pos[,endpos]])|re.match(pattern,string[,flags]):
这个方法将从string的pos下标处起尝试匹配pattern;
如果pattern结束时仍可匹配,则返回一个Match对象;
如果匹配过程中pattern无法匹配,或者匹配未结束就已到达endpos,则返回None。
pos和endpos的默认值分别为0和len(string);
re.match()无法指定这两个参数,参数flags用于编译pattern时指定匹配模式。
注意:
这个方法并不是完全匹配。
当pattern结束时若string还有剩余字符,仍然视为成功。
想要完全匹配,可以在表达式末尾加上边界匹配符'
下面来看一个Match的简单案例:
encoding:
UTF-8
2.import
4.#
将正则表达式编译成Pattern对象
5.pattern
8.match
10.if
match:
12.
match.group()
13.
14.###
输出
2.search
search(string[,pos[,endpos]])|re.search(pattern,string[,flags]):
这个方法用于查找字符串中可以匹配成功的子串。
从string的pos下标处起尝试匹配pattern,
若无法匹配,则将pos加1后重新尝试匹配;
直到pos=endpos时仍无法匹配则返回None。
pos和endpos的默认值分别为0和len(string));
re.search()无法指定这两个参数,参数flags用于编译pattern时指定匹配模式。
那么它和match有什么区别呢?
match()函数只检测re是不是在string的开始位置匹配,
search()会扫描整个string查找匹配,
match()只有在0位置匹配成功的话才有返回,如果不是开始位置匹配成功的话,match()就返回none
print(re.match(‘super’,‘superstition’).span())
会返回(0,5)
print(re.match(‘super’,‘insuperable’))
则返回None
search()会扫描整个字符串并返回第一个成功的匹配
print(re.search(‘super’,‘superstition’).span())
返回(0,5)
print(re.search(‘super’,‘insuperable’).span())
返回(2,7)
看一个search的实例:
2.#一个简单的search实例
5.
6.#
7.pattern
9.#
使用search()查找匹配的子串,不存在能匹配的子串时将返回None
这个例子中使用match()无法成功匹配
11.match
pattern.search('
13.if
16.
17.###
18.#
3.split
split(string[,maxsplit])|re.split(pattern,string[,maxsplit]):
按照能够匹配的子串将string分割后返回列表。
maxsplit用于指定最大分割次数,不指定将全部分割。
1.import
2.
3.p
\d+'
4.print
p.split('
one1two2three3four4'
6.###
['
one'
two'
three'
four'
]
4.findall
findall(string[,pos[,endpos]])|re.findall(pattern,string[,flags]):
搜索string,以列表形式返回全部能匹配的子串。
p.findall('
1'
2'
3'
4'
5.finditer
finditer(string[,pos[,endpos]])|re.finditer(pattern,string[,flags]):
搜索string,返回一个顺序访问每一个匹配结果(Match对象)的迭代器。
4.for
m
in
p.finditer('
m.group(),
7.###
8.#
1
2
4
6.sub
sub(repl,string[,count])|re.sub(pattern,repl,string[,count]):
使用repl替换string中每一个匹配的子串后返回替换后的字符串。
当repl是一个字符串时,可以使用\id或\g<
当repl是一个方法时,这个方法应当只
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Python 网络 爬虫 中的 正则 表达式 教程