正则表达式之爬虫小技巧

正则表达式之爬虫小技巧

正则表达式是一段字符串,它可以表示一段有规律的信息。使用正则表达式的步骤:

  1. ①寻找规律
  2. ②使用正则符号表示规律
  3. ③提取信息

常用知识

  1. .(前面这里是一个点),这个点代表可以代替除了换行符以外的任何一个字符,包括但不限于英文字母、数字、汉字、英文标点符号和中文标点符号,例如kin…me**,可以匹配kin与me之间的任意三个字符。比如可以匹配kin我和你me等**
  2. *(前面是星号)代表匹配前0个或多个字符
  3. ?(前面是问号)代表匹配0个或一个字符
  4. \t 制表符
  5. \d 表示匹配任意一位数字,\d*则表示匹配任意多个数字,经常用来设计手机号的匹配,比如\d{11}代表匹配11位数字
  6. \ 就表示一个一个\
  7. [ ]代表匹配[ ](前面这个方括号里面的任意一个字符),比如[a-z]就表示匹配任意一个小写字母
  8. {m,n}(前面这个是大花括号)表示至少出现m次,最多出现n次
  9. ^代表以什么开头,$表示结束符号,到此位置为止,就结束了
  10. 匹配11位手机号1^[3-9]\d{9},其中
  11. 1^代表必须以1开头,[3-9]代表3-9的数字,\d{9}匹配9位数字,$以什么结尾
  12. ()小括号可以把括号里面的内容提取出来,
    例如:我的密码是:12345abcde你帮我记住。
    :.?你代表:你之前的所有字符 即:12312345abcde你
    :(.
    ?)你 即12345abcde,即:和你之间的东西

不懂得看这个链接,这个链接是一个文档非常详细:https://www.runoob.com/regexp/regexp-tutorial.html

=======================================

  1. import re
    re.findall(pattern,string,flags=0)
    pattern表示正则表达式.*?什么的==类型字符串,string表示原来的字符串,及你需要匹配的字符串,flags表示一些特殊功能的标志。

re.S提取换行(忽略换行)

re.search(pattern,string,flags=0)从满足要求里面找出一个
======re.search函数用法–返回第1个满足要求的字符串,一旦找到符合要求的内容,就会停止查找。

  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))

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

-berry

互相学习就是最好的学习

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值