python爬虫教程小白从零开始项目实战(4)

什么是正则表达式?

//1.点号 .

一个点号可以替换除了换行符以外的任何一个字符

开头是“kin”,后面两个字符都是“me”
例如
kingname 
kinabcme
kin123me
kin我是谁me
kin嗨你好me
kin“m”me
就可以变成kin...me的形式,中间有多少个字符就有多少个点

2.星号 *

一个星号表示前面一个子表达式(普通字符,另外一个或几个正则表达式)0次到无限次

例如
如果快乐你就笑哈
如果快乐你就笑哈哈
如果快乐你就笑哈哈哈
如果快乐你就笑哈哈哈哈哈哈哈

用星号来表示:
如果快乐你就笑哈*
   		由于星号可以表示前面字符的0次,即使写出如果快乐你就笑*,也能满足正则表达式

--------------------------------------------------------------
如果点号星号一起用会怎么样?
.*.*哈:
它可以表示在“如”和“哈”中间出现“任意多个除了换行符以外的任意字符”
举例:
如哈        //不写
如果我快乐哈  //汉字
如1123//数字
如asddc哈     //字母
如 ? + =//符号

3.问号 ?

问号:表示它前面的子表达式0次或1次。//这里的问号是英文的问号

笑起来。
笑起来哈。
		在汉字 “来”和中文句号之间有0个或者1个哈字,都可以用下面这个正则表达式
笑起来哈?。

问号最大的用处是与点号和星号配合起来使用 构成 .*?.通过正则表达式,使用最多的也是这个组合。

如哈
如果快乐哈
如果快乐你就笑哈
如果你知道1+1=2请证明它
如asdfgh哈
都可以用如.*?哈正则表达式
那么 .*.*?有什么区别?
//将通过实际的例子进行解答

4.反斜杠 \

反斜杠转义字符

有下面这样的字符串
我的密码是*123456*不包括最外层星号
通过正则表达式表示
我的密码是\*.*\*不包括最外层星号

5.数字

正则表达式里面使用 \d 来表示一位数字。为什么要用字母d呢?
因为是英文 digital //数字的首字母
如果提取两个数字,可以使用\d \d
如果提取两位数字,可以使用\d\d\d
不知道数字有多少位,就使用*表示任意位数的数字

有下面一段字符串
是123455677,请记住它。
用正则表达式来表示
是\d*,请记住它。

6.小括号 ()

有下面一段字符串
我的密码是:12345abcde你帮我记住。
用正则表达式表示
:.*?)你
就可以获得
12345abcde

7.导入正则表达式,使用findall方法

python已经自带了一个功能非常强大的正则表达式模块。
使用这个模块可以非常方便的从一大段文字中提取有规律的信息
python的正则表达式模块名字为 re,也就是regular expression的首字母缩写。
使用正则表达式之前,要进行导包语句

导包语句为:
import re

包内有些方法需要我们学习

findall的函数原型为:
re.findall(pattern,string,flags=0)
pattern //正则表达式
string //字符串
flags//特殊功能标志
findall的结果是一个列表,包含匹配到的所有结果,如果没有匹配到,就会返回空列表。

import re

content ='我的微博密码是:123456,QQ密码是:33445566,银行卡密码是:888888,请帮我记住他们'
password_list=re.findall(':(.*?),',content)
lost_list=re.findall('那没事了(.*?)',content) #//故意写错正则表达式,找不到
print('找到内容,返回:{}'.format(password_list))
print('找不到内容,返回:{}'.format(lost_list))

运行结果
在这里插入图片描述

import re

account_content ='公众号是:乖气致异,密码是:gongzhonghao123456,cnds账号是:999999,密码是:123456,'
account_password=re.findall('号是:(.*?),密码是:(.*?),',account_content)
print('包含多个括号的情况,返回:{}'.format(account_password))

在这里插入图片描述

请注意查看代码中的冒号:逗号, 实际使用正则表达式的过程中,中英文标点符号经常导致各种问题. 中英文符号是根本不一样的,看起来非常相似,在某些字体甚至无法察觉,因此使用正则表达式时,最好直接复制粘贴,不要手动输入

中文符号 ,:
英文符号 , :

re.findall(pattern,string,flags=0)
这个flags 参数是可以省略的
使用flags可以忽略大小写,忽略换行符等等…
这里以忽略换行符说明,示范

import re
string='''
我是xiaowei,我的微博密码是:123
45678,'''
password_flags=re.findall('密码是:(.*?),',string,re.S)
password_noflags=re.findall('密码是:(.*?),',string)
print('使用re.S的时候:{}'.format(password_flags))
print('不使用re.S的时候:{}'.format(password_noflags))

运行结果
在这里插入图片描述

使用爬虫开发非常容易出现这样的情况,要匹配的内容存在换行符\n. 要忽略换换行符,就需要使用到re.S这个flags. 虽然说匹配到的结果出现了\n 这个符号,不过总比什么都拿不到要强.内容里面的换行符在后期清洗数据替换掉即可.

9.本章内容到此结束了

我们了解了什么是正则表达式
并且敲代码实践了,并学会了导包和findall方法的使用.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章