python爬虫新手学习日记(三)

124 阅读2分钟

正则表达式的使用

前言:使用正则表达式向大量信息中获取有用信息

符号意义
.除换行符以外的所有字符
\w(小写)字母数字下划线
\s(小写)空白符
\d数字
\n换行符
\t制表符
^字符串开始
$字符串结尾
\W非字母数字下划线
\D非数字
\S非空白字符串
a|b匹配a或者b
()括号内表达式
[...]匹配字符串组中所有字符
[^...]匹配除了字符串组中所有字符
*任意次
+至少一次
最多一次
{n}n次
{n,}至少n次
{n,m}n到m次
.*惰性匹配
.*?贪婪匹配

①匹配字符串

使用正则表达式需要导入re库

re有三个常用的函数
函数名返回内容
findall返回一个list(包含全部匹配到的内容)
finditer返回一个迭代器(包含全部匹配到的内容)
match字符串的第一个字符匹配起(若匹配失败返回None)
compile提前加载正则表达式(参数是正则表达式规则)

三个函数的参数都可以传入两个参数:第一个是正则表达式规则,第二个是待匹配字符串

例子:

import re

message = "你好,我的名字是Tom,电话是10010。你的名字是Jay,电话是10086。他的名字是Jack,电话是10000。"

ans = re.findall("[a-zA-Z]+", message)
print("findall函数输出:", ans)

ans = re.finditer("[a-zA-Z]+", message)
print("迭代器输出:")
for it in ans:
    print(it, it.group())

ans = re.match("[a-zA-Z]+", message)
print("match匹配:", ans)

输出内容如下:

image.png
findall返回list对象
迭代器输出得是迭代器对象,需要用it.group()获取匹配到的字符串
如果将message中的(你好,我的名字是)去掉match就能匹配到Tom,因为match相当于是默认使用了^,从头开始匹配,返回第一个字符串。

②从正则表达式中获取有用信息

import re

message = "你好,我的名字是Tom,电话是10010。你的名字是Jay,电话是10086。他的名字是Jack,电话是10000。"

obj = re.compile(r"\w+名字是(?P<a>\w+),电话是(?P<b>\d+)。")
ans = obj.finditer(message)
for it in ans:
    print(it.group("a"),it.group("b"))

在re.compile中有两个相似的地方(?P<a>\w+)和(?P<b>\d+),其中w+和d+是匹配的规则,而?P尖括号中字符是一个标记,表示给我们需要的信息做一个标记,在迭代器中我们可以在group里加上标记参数从而拿到我们需要的数据。
注:compile中匹配规则左边的r表示不进行转义操作

image.png