python爬虫学习

正则表达式

. 匹配除换行符以外的任意字符
\w  匹配字母或数字或下划线
\s  匹配任意地空白符
\d  匹配数字
\n  匹配一个换行

\t 匹配一个制表符
^ 匹配字符串的开始
$ 匹配字符串的结尾

\W 匹配非字母或数字或下划线
\D 匹配非数字
\S 匹配非空白符
a|b 匹配字符a或字符b
()  匹配括号内的表达式,也表示一个组
[…] 匹配字符组中的字符
[^…]  匹配除了字符组中的字符的所有字符

---------------------------------------------------------------

量词:控制前面的元字符出现的次数

*        重复零次或更多次

+        重复一次或更多次

?       重复零次或一次

{n}       重复n次

{n,}        重复n次或更多次

{n,m}        重复n次到m次

例子:

^\d\d\d\d\d : 开始到最后必须是数字

[abcdefg]   :   每个字在字符组中是否出现

[a-zA-Z0-9] : 字符组范围

[^a-zA-Z0-9]   :除了范围里的都是

\d{11}        :        匹配11位数字

\d+       : 匹配数字至少出现一次或者多次

---------------------------------------------------------------

贪婪匹配和惰性匹配

.*        :贪婪匹配   . 匹配除换行符以外的任意字符 *是多个

.*?        :惰性匹配  *?尽可能少匹配东西

内容<div class="jay">周杰伦</div><div class="jj">林俊杰</div>

正则表达式<div class=".*?">(.*?)</div>

结果<div class="jay">周杰伦</div><div class="jj">林俊杰</div>

---------------------------------------------------------------

str:sefasfesafeasxfeswefwfsx

正则.*?x

sefasfesafeasx

feswefwfsx

---------------------------------------------------------------

扩展

[\u4e00-\u9fa5]                        匹配中文字符

\n\s*\r                                        匹配空白行

[\w!#$%&'*+/=?^_`{|}~-]+(?:\.[\w!#$%&'*+/=?^_`{|}~-]+)*@(?:[\w](?:[\w-]*[\w])?\.)+[\w](?:[\w-]*[\w])?

匹配邮箱

[a-zA-z]+://[^\s]*                网址url

\d{3}-\d{8}|\d{4}-\{7,8}                匹配国内电话号码

[1-9][0-9]{4,}                                匹配腾讯qq号

[1-9]\d{5}(?!\d)                                匹配中国邮政

^(\d{6})(\d{4})(\d{2})(\d{2})(\d{3})([0-9]|X)$                匹配18位身份证

import re
lst = re.findall(r"\d+","我的电话是:10086,我儿子电话号码10089")
print(lst)

输出['10086', '10089']

#finditer:匹配字符串中所有的内容[返回的是迭代器],从迭代器中拿到内容需要.group()
it = re.finditer(r"\d+","我的电话是:10086,我儿子电话号码10089")
for i in it:
    print(i.group())
#search,找到一个结果就返回,返回的结果是match对象,拿数据需要.group()
s= re.search(r"\d+","我的电话是:10086,我儿子电话号码10089")
print(s.group())

#match是从头开始匹配
s= re.match(r"\d+","10086,我儿子电话号码10089")
print(s.group())
预加载正则表达式
#预加载正则表达式
obj = re.compile(r"\d+")
ret = obj.finditer("我的电话是:10086,我儿子电话号码10089")
for it in ret:
    print(it.group())

(?P<组名>正则)可以从正则匹配的内容中进一步提取内容

s = """
<div class='西游记'><span id='10010'>中国联通</span></div>
<div class='fesf'><span id='21231'>爽肤水</span></div>
"""
#(?P<组名>正则)可以从正则匹配的内容中进一步提取内容
obj = re.compile(r"<div class='.*?'><span id='(?P<id>\d+)'>(?P<wahaha>.*?)</span></div>",re.S)

result = obj.finditer(s)
for it in result:
    print(it.group("id"))
    print(it.group("wahaha"))
obj = re.compile(r"<span id='(?P<id>\d+)'>(?P<name>\w+)</span>",re.S)

result = obj.search(s)
print(result.group())
print(result.group("id"))
print(result.group("name"))

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值