正则表达式之爬虫小技巧
正则表达式是一段字符串,它可以表示一段有规律的信息。使用正则表达式的步骤:
- ①寻找规律
- ②使用正则符号表示规律
- ③提取信息
常用知识
- .(前面这里是一个点),这个点代表可以代替除了换行符以外的任何一个字符,包括但不限于英文字母、数字、汉字、英文标点符号和中文标点符号,例如kin…me**,可以匹配kin与me之间的任意三个字符。比如可以匹配kin我和你me等**
- *(前面是星号)代表匹配前0个或多个字符
- ?(前面是问号)代表匹配0个或一个字符
- \t 制表符
- \d 表示匹配任意一位数字,\d*则表示匹配任意多个数字,经常用来设计手机号的匹配,比如\d{11}代表匹配11位数字
- \ 就表示一个一个\
- [ ]代表匹配[ ](前面这个方括号里面的任意一个字符),比如[a-z]就表示匹配任意一个小写字母
- {m,n}(前面这个是大花括号)表示至少出现m次,最多出现n次
- ^代表以什么开头,$表示结束符号,到此位置为止,就结束了
- 匹配11位手机号1^[3-9]\d{9},其中
- 1^代表必须以1开头,[3-9]代表3-9的数字,\d{9}匹配9位数字,$以什么结尾
- ()小括号可以把括号里面的内容提取出来,
例如:我的密码是:12345abcde你帮我记住。
:.?你代表:你之前的所有字符 即:12312345abcde你
:(.?)你 即12345abcde,即:和你之间的东西
不懂得看这个链接,这个链接是一个文档非常详细:https://www.runoob.com/regexp/regexp-tutorial.html
=======================================
- import re
re.findall(pattern,string,flags=0)
pattern表示正则表达式.*?什么的==类型字符串,string表示原来的字符串,及你需要匹配的字符串,flags表示一些特殊功能的标志。
re.S提取换行(忽略换行)
re.search(pattern,string,flags=0)从满足要求里面找出一个
======re.search函数用法–返回第1个满足要求的字符串,一旦找到符合要求的内容,就会停止查找。
- # 如果匹配成功,则是一个正则表达式的对象
# 如果没有匹配到任何数据,就是None。
# 如果需要得到匹配到的结果,则需要通过group()函数来获取里面的值。
# 只有在group(1)的时候,才能把正则表达式里面的括号中的结果打印出来
***group参数不能超过正则表达式内容即元组的个数
.匹配所有的字符串,即无提取。
.?满足最短的一个字符串
“.* ” “.*? ” 的区别
“.* ” 贪婪模式,获取最长的满足条件的字符串
“.*? ”非贪婪模式,获取最短的满足条件的字符串
代码练习,有兴趣的可以复制粘贴或者敲一敲
import re
content='''我的微博密码是:1234567,QQ密码是:33445566,
银行卡密码是:888888,Github密码是:999abc999,帮我记住他们'''
passwd_list=re.findall(":(.*?),",content)
print("内容为:{}".format(passwd_list))
print("===============================================")
content1='''微博账号是:kingname, 密码是:12345678,
QQ账号是:99999, 密码是:890abcd, 银行卡账号是:000001,
密码是:654321, Github9账号是:9999@qq.com, 密码是:7777love8888,
请记住他们。'''
account_password=re.findall('账号是:(.*?), 密码是:(.*?),',content1)
print("内容为:{}".format(account_password))
print("-----------------------------------------------")
big_string_mutil = '''
我是kingname,我的微博密码是:123
45678,
'''
no_flag=re.findall('密码是:(.*?),',big_string_mutil)
ll_flag=re.findall('密码是:(.*?),',big_string_mutil,re.S)
print(no_flag)
print(ll_flag)
print("===============================================")
content = '我的微博密码是:1234567,QQ密码是:33445566, 银行卡密码是:888888,Github密码是:999abc999,帮我记住他们'
password_search = re.search('密码是:(.*?),', content)
password_search_not_find = re.search('xxx:(.*?),', content)
print(password_search)
print(password_search.group())
print(password_search.group(0))
print(password_search.group(1))
print(password_search_not_find)
print("=====================================================================")
# group()参数为1表示读取第1个括号中的内容
# group()参数为2表示读取第2个括号中的内容
account_content = '微博账号是:kingname, 密码是:12345678, QQ账号是:99999, 密码是:890abcd, 银行卡账号是:000001, ' \
'密码是:654321, Github账号是:99999@qq.com, 密码是:7777love8888, 请记住他们。'
account_password = re.search('账号是:(.*?), 密码是:(.*?),', account_content)
print('读取第一个括号的内容: {}'.format(account_password.group(1)))
print('读取第二个括号的内容: {}'.format(account_password.group(2)))
print("==========================================================")
# “.* ” “.*? ” 的区别
# “.* ” 贪婪模式,获取最长的满足条件的字符串
# ““.*? ”非贪婪模式,获取最短的满足条件的字符串
content = '我的微博密码是:1234567,QQ密码是:33445566, 银行卡密码是:888888,Github密码是:999abc999,帮我记住他们'
without_question_mark = re.findall('密码是:(.*),', content)
with_question_mark = re.findall('密码是:(.*?),', content)
print('不使用问号的结果: {},长度为:{}'.format(without_question_mark, len(without_question_mark)))
print('使用问号的结果: {},长度为:{}'.format(with_question_mark, len(with_question_mark)))
print("======================================================")
# big_small_text = '''
# 有效用户:
# 姓名: 张三
# 姓名: 李四
# 姓名: 王五
# 无效用户:
# 姓名: 不知名的小虾米
# 姓名: 隐身的张大侠
# '''
#无效和有效姓名
# user=re.findall('姓名: (.*?)\n',big_small_text)
# print(user)
# #有效姓名
# user_big=re.findall('有效用户(.*?)无效用户',big_small_text)
# print("user_big的值为:{}".format(user_big))
# #真正有效的人名
# user_userful=re.findall('姓名: (.*?)\n',user_big[0])
# print(user_userful)
# 先抓大后抓小 先把有效用户这个整体匹配出来,再从有效用户里匹配出人名
big_small_text = '''
有效用户:
姓名: 张三
姓名: 李四
姓名: 王五
无效用户:
姓名: 不知名的小虾米
姓名: 隐身的张大侠
'''
# user = re.findall('姓名: (.*?)\n', big_small_text)
# print(user)
user_big = re.findall('有效用户(.*?)无效用户', big_small_text, re.S)
print('user_big 的值为: {}'.format(user_big))
user_useful = re.findall('姓名: (.*?)\n', user_big[0])
print('真正有效的人名:{}'.format(user_useful))
print("===========================================")
#括号和“.*?”一起使用
#括号内有其他普通字符---这些普通字符就会出现在获取的结果里面
html = '''<div class="tail-info">客户端</div>
<div class="tail-info">2017-01-01 13:45:00</div>
'''
result_1 = re.findall('tail-info">(.*?)<', html)
result_2 = re.findall('tail-info">2017(.*?)<', html)
result_3 = re.findall('tail-info">(2017.*?)<', html)
print('括号里只有.*?时,得到的结果:{}'.format(result_1))
print('2017在括号外面时,得到的结果:{}'.format(result_2))
print('2017在括号里面时,得到的结果:{}'.format(result_3))