Python零基础入门二十四之正则表达式知识补充

为了以后更好地使用正则表达式来高效地抓取我们需要的各种资源,这篇博客将补充一些更常用的正则表达式的知识。
一、元字符
1.管道符 | 或的意思
2.^脱字符 匹配输入字符串的开始位置
也就是说脱字符后面紧跟的字符在要查找字符串的文件中是在开头的位置
如果设置了re.MULTLINE标志,^也可匹配换行符之后的位置
3. 美元符号 匹配字符串的结束位置,以$符号前面的字符结尾
4.\ 反斜杠
(1).将一个普通字符转变为特殊字符
(2).解除元字符的特殊功能所匹配的字符串
5.[] 字符类 匹配所包含的任意一个字符
注1:连字符-如果出现在字符串中间表示字符范围的描述
,如果出现在首位则仅作为普通字符
注2:特殊字符仅有反斜杠\保持特殊含义,用于转义字符
,其它字符如*,+,?等均作为普通字符匹配
注3:脱字符^如果出现在首位则表示匹配不包含其中的
任意字符,其实就是将符号类的作用进行了取反,
如果^出现在字符串中间就仅作为普通字符匹配
6.* 匹配前面的子表达式零次或者多次 {0,}
7.+ 匹配前面的子表达式一次或者多次 {1,}
8.? 匹配前面的子表达式零次或者一次 {0,1}
9.贪婪:只要符合就尽可能多的匹配,禁用贪婪模式就是在后面加上问号

import re
print(re.search(r'Fish(C|D)','FishC'))
print(re.search(r'Fish(C|D)','FishD'))

print(re.search(r'^Fish','I Love FishC.com'))
print(re.search(r'^Fish','FishC.com'))

print(re.search(r'FishC$','I Love FishC.com'))
print(re.search(r'com$','FishC.com'))

#以列表的形式返回元素
print(re.findall(r'[a-z]','I love FishC.com'))
#字符类消除匹配符.号的作用
print(re.search(r'.','I Love FishC.com'))
print(re.search(r'[.]','I Love FishC.com'))
#字符类中^(脱帽符)的特殊作用
print(re.findall(r'[^a-z]','I Love FishC.com'))
#这个字符类中的匹配的字符是a-z中的字符和^这个符号
print(re.findall(r'[a-z^]','I Love FishC.com^'))
#数字 007 与 7 的问题
print(re.search(r'\d\d7','7'))
#这样便可以解决,\d代表的数字可有可无,充分理解或者的意思
print(re.search(r'\d?\d?7','7'))
s='<html><title>I Love FishC.com</title></html>'
#+的作用是匹配前面的字符一次或者多次
print(re.search(r'<.+>',s))
print(re.search(r'<.+?>',s))

这里写图片描述

二、+字母的特殊字符
\A:匹配输入字符串的开始位置,类似于脱帽符
\Z:匹配输入字符串的结束位置,类似于$
\b 匹配一个单词的边界
\B 匹配一个单词的非单词界限
\d 匹配任何一个数字
\D 匹配任何非数字
\s 匹配Unicode中的空白字符,包括(\t\n\f\v)
\S 与小写取反
\w 匹配任何的单词字符(包括汉字) 包括[a-zA-Z0-9_]
\W 与小写相反

import re
print(re.findall(r'\bFishC\b','FishC.com!FishC_com!(FishC)'))
#结果返回两个FishC,返回的是第一个和最后一个中间的一个之所以没有被返回#是因为下划线被当作是一个单词,而不是一个符号,即不是一个界限
print(re.findall(r'\BFishC\B','FishC.com!nyFishC_com!(FishC)'))
#这个函数打印出来的就是中间的FishC,因为只有它的左右两边都不是界限
print(re.findall(r'\w','我爱鱼C工作室(_I love FishC.com)'))
print(re.findall(r'\W','我爱鱼C工作室(_I love FishC.com)'))

这里写图片描述

三、正则表达式的编译

如果需要重复地使用某个正则表达式,那么你可以先将该正则表达式编译成模式对象,我们使用re.compile方法来编译.

print('编译正则表达式部分')
#p变成了模式对象,模式对象也有search,findall方法
#作用与模块函数相同,只不过参数少了一个
p=re.compile(r'[A-Z]')
print(p.search('I Love FishC.com'))
print(p.findall('I Love FishC.com'))

这里写图片描述

四、正则表达式常用的方法

1.search()方法不会立刻返回我们所需要的
字符串对象,而是返回的匹配对象
2.findall()方法
如果给出的正则表达式包含着子组,则该方法
会将子组的内容单独打印出来
如果有多个子组,则该方法会以元祖的形式将结果返回
如果要解决该问题,可以在(左括号后面加上’?:’即可
五、匹配对象(即re.search和re.findall方法返回的参数)常用的方法
注(match:re.search和re.findall方法返回的参数)

1.match.group()
使用group方法可以将其转换成一个字符串对象
如果正则表达式中设置了子组,我们可以在group
中加入序号返回相应的子组,从1开始计数
2.match.start()
返回第一个匹配的位置,这里从0开始计数
3.match.end()
返回最后一个匹配的位置
4.match.span()
返回匹配的范围

最后,优化一下爬取代理ip的程序。

import urllib.request
import os
import re

def get_html(url):
     req=urllib.request.Request(url)
     req.add_header('User-Agent','Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36')
     response=urllib.request.urlopen(req)
     html=response.read()
     return html     
def downip():
     url='http://www.kuaidaili.com/'
     html=get_html(url).decode('utf-8')
     r=r'(?:(?:[01]?\d?\d|2[0-4]\d|25[0-5])\.){3}(?:2[0-4]\d|[01]?\d?\d|25[0-5])'
     ip=re.findall(r,html)
     for each in ip:
          print(each)
if __name__=='__main__':
     downip()

这里写图片描述

结合着上述知识来看这段代码不难理解,关于正则表达式的知识先暂时到这了,之后在学到新的指知识会及时补充。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值