-
Thinking in Java读书笔记
2019-07-31 18:37:16Thinking in Java读书笔记(IO和并发除外) 1.1、类中所有的private方法都隐式地指定为final的,由于其他类无法取用private方法,所以也就无法覆盖它;private方法无法被重写,继承对应private的方法无效,private...Thinking in Java读书笔记(IO和并发除外)
1.1、类中所有的private方法都隐式地指定为final的,由于其他类无法取用private方法,所以也就无法覆盖它;private方法无法被重写,继承对应private的方法无效,private的属性也无法拿到,但我们通常private的属性有对应的get、set方法,通常是public的,所以子类继承后可以调用方法来取得到父类的属性。
1.2、final类禁止继承,所以final类中所有的方法都隐式地指定为final的,因此无法覆盖他们,你也可以给他们添加final关键字,但这没什么意义。
1.3、java中所有方法都是通过动态绑定来实现多态的。
1.4、如果某个方法是静态的,它的行为就不具有多态性。所以构造器不具有多态性,他们实际上是static的,只不过该static声明是隐式的。
2.1、在方法的作用域内(而不是其他类的作用域内)创建一个完整的类,这个类称为局部内部类(其实命名就和局部变量一样,在方法中的变量叫局部变量)。
3.1、Set中,HashSet拥有最快的获取元素的方式;如果存储顺序很重要,那么使用TreeSet,它按照比较结果的升序保存对象,或者使用LinkedHashSet,它按照被添加的顺序保存对象。
3.2、List中,基本的arrayList擅长随机访问元素,但是在中间插入和移除元素时会比较慢;LinkedList和arrayList相反,中间插入和删除快,随机访问慢。
3.3、ListIterator是一个更加强大的迭代器,但看名字就知道只用于List类,普通的Iterator只能向前移动,就只有hasNext(),但ListIterator可以双向移动,有hasNext()和hasPrevious()两种移动方式。
3.4、Queue是队列,典型的先进先出容器,即从一端进去,另一端出来,取出顺序和放入顺序一样。
3.5、java容器实际上就四种:Map、List、Set和Queue。下面详细地介绍一下各个容器类型的性能特点区别:
3.5.1、List:元素可以重复。
ArrayList:底层是由数组支持的;
LinkedList:是由双向链表实现的,其中的每一个对象都包含数据的同时还包含了指向链表中前一个和后一个元素的引用。
因此如果要经常在表中插入和删除元素,LinkedList比较合适。
3.5.2、Set:元素必须唯一,不允许重复,是否重复由equals()方法判定,所以加入set的元素必须定义equals()方法以确保对象的唯一性。
HashSet:为快速查找而设计的Set,其中的元素必须定义hashCode()方法,一般情况下都用他。
Treeset:保存了次序的set,底层为(平衡)树结构,使用他可以从Set中提取有序的序列,其中的元素必须实现Comparable接口(实现里面的compareTo方法)。SortedSet是TreeSet的唯一实现。
LinkedHashSet:具有HashSet的查询速度,使用链表来维护元素的顺序(这个顺序就是插入的次序),所以使用迭代器遍历他时,结果就是插入的次序,元素必须定义hashCode()方法。
3.5.3、map:保存的是键值对,key不能重复,是唯一的,可以但只能有一个为null,value可重复,可为null。
HashMap:是map基于散列表的实现(现在已经取代了HashTable)。插入和查询键值对的开销是固定的,可以通过构造器设置容量和负载因子,以调整容器的性能。通常我们都使用他。
LinkedHashMap:在HashMap的基础上保存了键值对插入的次序,访问速度比hashMap慢一点,但迭代访问时反而更快,因为内部使用链表维护内部次序。
TreeMap:基于红黑树的实现,查看键或者键值对时,他们会被排序(次序由Comparable或者Comparator决定),因此特点就是结果是排过序的,他是唯一一个具有subMap()方法的map,可以返回一个子树。SortedMap是TreeMap现阶段的唯一实现。
ConcurrentHashMap:一种线程安全的map,它不涉及同步加锁,却比HashTable或者通过加锁来实现同步的Collections.synchronizedMap(Map)得到的同步map性能更好。Collections.synchronizedMap(Map)是把一个不同步的map作为参数返回一个同步的,靠加锁来实现的。
WeakHashMap:弱键映射,允许释放映射所指向的对象,为解决特色问题而设计的。
IdentityHashMap:使用==代替equals()对“键”进行比较的散列映射,专为解决特殊问题而设计。
3.6、Object.hashCode()方法生成散列码,而它默认使用对象的地址计算散列码,除非重写他;Object.equals()默认比较对象的地址是否相同,除非你重写他。
3.7、hashmap的结构我们通常叫他散列桶,散列表中的槽位通常称为桶位,因此实际散列表的数组命名为bucket。
3.8、设计hashCode()时,最重要的因素是,无论何时,对同一个对象调用hashCode()都应该返回同样的值,当然这个对象内的属性不应该发生了变化。
3.9、java容器采用快速报错机制,他会探查容器上的任何除了你的进程所进行的操作以外的所有变化,一旦发现其他进程修改了容器,就会立刻抛出ConcurrentModificationException异常。一个简单的例子就可以看出快速报错的原理:
public static void main(String[ args){
Collection<String> c = new ArrayList<String>();
Iterator<String> it = c.iterator();
c.add("An Object");
try{
String s = it.next();
}catch(ConcurrentModificationException e){
System.out.println(e);
}
}
//输出:java.util.ConcurrentModificationException。。。
以上程序在运行时出现异常,catch后输出了异常信息,因为在容器取得迭代器后,又有东西放入到了容器中。当程序的不同部分修改了同一个容器时,就可能导致容器的状态不一致,就出现了这个异常。此例中,迭代器在获取容器后也可能会有修改容器的操作(比如iterator.remove()操作),所以在获取迭代器后,不能再调用容器的add方法改变容器,应该在获取迭代器之前就添加好元素。
3.10、在3.5中也提到了Hashtable,它和HashMap相似,甚至方法名也相似,Hashtable是同步的,但HashMap的同步问题也可通过Collections的一个静态方法得到解决: Map Collections.synchronizedMap(Map m) 这个方法返回一个同步的Map,这个Map封装了底层的HashMap的所有方法,使得底层的HashMap即使是在多线程的环境中也是安全的。 所以没有理由再使用Hashtable而不用HashMap了。
4.1、Throwable对象可分为两种类型(指从Throwable继承来的类型):Error用来表示编译时和系统错误(除特殊情况外,一般不用你关心);Exception是可以抛出的基本类型。
4.2、因为finally子句一定会执行,即便在try子句中return,也会继续执行finally子句。
5.1、String对象是不可变的,String类中每一个看起来会修改String值的方法,实际上都是创建一个全新的String对象,最初的String对象则丝毫不动。
6.1、java泛型是使用擦除来实现的,这意味着当你在使用泛型时,任何具体的类型信息都被擦除了,你唯一知道的就是你在使用一个对象。因此List<String>和List<Integer>在运行时事实上是相同的类型,都被擦除成他们的“原生”类型--List。理解擦除以及如何处理它,是你在学习java泛型时面临的最大障碍。如下:
Class c1 = new ArrayList<String>().getClass();
Class c2 = new ArrayList<Integer>().getClass();
System.out.println(c1 == c2);//输出:true
同样的因为擦除,同一个类就不能实现同一个泛型接口的两种变体,如下:
interface A<T> {}
Class B implements A<Integer> {}
Class C extends B implements A<String> {}
类C不能编译,A<Integer>和A<String>因为擦除而简化为相同的类型A,这样C就重复实现了接口A两次了。
但是有趣的是,如果把A的泛型参数去掉,编译是可以的。如下:
interface A {}
Class B implements A {}
Class C extends B implements A {}
类C可以编译。
6.2、java泛型的限制之一:不能将基本类型用作泛型的类型参数,如ArrayList<int>之类的是不能创建的。
7.1、编译器会为你创建的enum都继承自java.lang.Enum。
7.2、枚举的values()方法返回enum实例的数组,而且该数组中的元素严格保持在enum中的声明顺序。有趣的是,你的enum中没有values()方法,你会以为是编译器会为你创建enum时继承了Enum,values方法应该在Enum这个父类里。可惜,如果你研究一下Enum类就发现也不是,Enum里也没有。答案是,values()方法是由编译器添加的static方法,是编译器在创建enum时加进去的。
7.3、ordinal()方法返回一个int值,这是每个enum实例在声明时的次序,从0开始。
7.4、对应enum实例可以直接使用==比较,编译器会自动为你提供equals()和hashcode()方法。
7.5、我们也知道所有的enum都会继承自java.lang.Enum,因为java不支持多重继承,所以你的enum不能再继承其他类了。
enum EnumA extends ClassB{...}这是不行的。
7.6、enum还有一个非常有趣的特性,就是它允许你为enum实例编写方法,从而为每个enum实例赋予各自不同的行为。大致步骤就是在enum中定义抽象方法,然后每个实例都实现它。如下:
public enum EnumTest{
SHI_LI_ONE {
String getInfo(){
return "实例1";
}
},
SHI_LI_TWO {
String getInfo(){
return "实例2";
}
};
abstract String getInfo();
}
8.1、switch语句是可以没用default子句的,当表达式的值和所有值都不同时就退出了switch语句,继续执行后面的。
9.1、注解也被称之为元数据,它为我们在代码里添加信息提供了一种形式化的方法。注解的定义用@interface。例如:
public @interface Test{}
9.2、注解不支持继承,不能使用extends来继承某个@interface。
10.1、我们都知道static修饰的变量存放在方法区中,和类信息存放在一起,所以只有一份,可以用它来修饰作为多线程任务区分的标识ID,例如每创建一个任务就加1等。
-
《图解HTTP》读书笔记
2019-08-27 20:47:10《图解HTTP》读书笔记 第一章:了解Web及网路基础 TCP/IP协议 把互联网想关联的协议集合起来总称为TCP/IP协议 TCP/IP 协议族按层次分为:应用层,传输层,网络层,数据链路层 应用层 决定了向用户提供应用服务时通信...《图解HTTP》读书笔记
第一章:了解Web及网路基础
TCP/IP协议
把互联网想关联的协议集合起来总称为TCP/IP协议
TCP/IP 协议族按层次分为:应用层,传输层,网络层,数据链路层应用层
决定了向用户提供应用服务时通信的活动。
TCP/IP 协议族内预存了各类通用的应用服务,比如:FTP 和 DNS 服务就是其中两类
HTTP 协议也处于该层传输层
传输层对上层应用层,提供处于网络连接中的两台计算机之间的数据传输。
在传输层有两个性质不同的协议:TCP(Transmission Control Protocol,传输控制协议)和 UDP(User Data Protocol,用户数据报协议)网路层(又名网络互联层)
网路层用来处理网络上流动的数据包。数据包是网络传输的最小数据单位,该层规定了通过怎样的路径(所谓的传输路线)到达对方的计算机,并把数据包传送给对方。与对方计算机之间通过多台计算机或网络设备进行传输时,网络层所起的作用就是在众多的选项内选择一条传输路线。
链路层(又名数据链路层,网络接口层)
用来处理连接网络的硬件部分。包括操作系统、硬件的设备驱动、NIC(Network Interface Card,网络适配器,即网卡),及光纤等物理可见部分,硬件上的范畴均在链路层的作用范围之内。
TCP/IP 通信传输流
利用TCP/IP 协议族进行通信时,会通过分层顺序与对方进行通信,发送端从应用层往下走,接收端则从应用层往上走。
发送端在层与层之间传输数据时,没经过一层时必定会被打上一个该层所属的首部信息,反之,接收端在层与层之间传输数据时,每经过一层时会把对应的首部消去。- 这种把数据信息包装起来的做法称为封装。确保可靠性的 TCP 协议
按层次分,TCP位于传输层,提供可靠的字节流服务(字节流:为了方便传输,将大块数据分割成以报文段为单位的数据包进行管理)。
TCP 协议为了更容易传送大数据才把数据分割,而且 TCP 协议能够确认数据最终是否送达到对方。如何确保数据能到达目标?
TCP 协议采用了三次握手策略。用TCP协议把数据包送出去以后,TCP不会对传送后的情况置之不理,它一定会向对方确认是否成功送达,握手过程使用了TCP的标志:SYN(synchronize)和 ACK(acknowledgement)。
发送端首先先发送一个带SYN标志的数据包给对方,接收端收到后,回传一个带有 SYN/ACK 标志的数据包以示传达确认信息,最后,发送端再回传一个带 ACK 标志的数据包,代表握手结束。若捂手过程中在某个阶段莫名中断,TCP协议会在此以相同的顺序发送相同的数据包负责域名解析的 DNS 服务
DNS(Domain Name System)服务是和HTTP协议一样位于应用层的协议,它提供域名到IP地址之间的解析服务。
浏览一个网址的全过程:
URL(Uniform Resource Locator,统一资源定位符) 和 URI(统一资源标示符)
URL 是访问web页面需要输入的网页地址
URI 是由某个协议方案表示的资源的定位标示符,协议方案是指访问资源所使用的协议类型名称URI 用字符串标识某一互联网资源,而URL表示资源的地点(互联网上所处的位置),可见 URL 是 URI 的子集。
第二章:简单的HTTP协议
HTTP请求报文由:请求方法、请求URI、协议版本、可选的请求首部字段和内容实体 构成
HTTP 是一种不保存状态,即无状态协议。
HTTP 协议自身不对请求和响应之间的通信状态进行保存。目的是为了更快的处理大量事务,确保协议的可伸缩性。
后来有一些场景需要保存客户端的状态,比如登录状态,于是引入了 Cookie 技术。有了 Cookie 再用HTTP协议通信,就可以管理状态了。告知服务器意图的HTTP方法
- GET : 获取
- POST: 传输实体主体
- PUT : 传输文件
- HEAD: 获得报文首部
- DELETE: 删除文件
- OPTIONS: 询问支持的方法
- TRACE:追踪路径
- CONNECT:要求用隧道协议连接代理
持久连接节省通信量
HTTP 初始版本,每进行一次HTTP通信就要断开一次TCP连接,当年数据小没问题,但随着HTTP的普及,HTTP所传输的内容愈来愈多,每次请求都会造成无谓的TCP连接建立和断开,增加通信量的开销。
为解决上述TCP连接的问题,HTTP/1.1 和 一部分 HTTP/1.0 相处了持久连接的方法,特点是:只要任意一端没有明确的提出断开连接,则保持TCP连接状态。
管线化
持久连接使得多数请求以管线化(pipelining)方式发送成为可能,以前发送请求后需等待并受到响应,才能发送下一个请求。管线化技术出现后,不用等待响应亦可直接发送下一个请求。这样就能做到同时并行发送多个请求。而不需要一个接一个地等待响应了。
第三章:HTTP报文内的HTTP信息
请求报文和响应报文的首部内容由以下数据组成:
-
请求行
包含用于请求的方法,请求 URI 和 HTTP 版本 -
状态行
包含响应结果的状态码,原因短语和HTTP版本 -
首部字段
包含请求和响应的各种条件和属性的各类首部
一般有四种首部:通用首部,请求首部,响应首部和实体首部 -
其他
可能包含HTTP的RFC 里未定义的首部(Cookie等)
编码提升传输速率
报文
是HTTP通信中的基本单位,由8位字节流组成,通过 HTTP 通信传输
实体
作为请求或响应的有效载荷数据(补充项)被传输,其内容由实体首部和实体主体组成
HTTP 报文的主体用于传输请求或响应的实体主体。通常,报文主体等于实体主体。只有当传输中进行编码操作时,实体主体的内容发生变化,才导致它和报文主体产生差异。
第四章:返回结果的HTTP状态码
状态码的类别
类别 原因短语 1xx Infomational(信息性状态码) 接收的请求正常处理 2xx Success(成功状态码) 请求正常处理完毕 3xx Redirection(重定向状态码) 需要进行附加操作以完成请求 4xx Client Error(客户端状态错误码) 服务器无法处理请求 5xx Server Error(服务器状态码) 服务器处理请求出错 常见错误码
2xx - 成功
- 200 OK : 请求被正常处理。
- 204 No Content : 请求成功但返回的响应报文中不含实体的主体部分,一般只需要从客户端往服务器发送信息,而对客户端不需要发送新信息内容的情况下使用。
- 206 Partial Content : 客户端进行了范围请求,服务器成功执行了这部分GET请求,响应报文中包含由 Content-Range 指定范围的实体内容
3xx - 重定向
- 301 Moved Permanently : 永久性重定向,该状态码表示请求的资源已被分配了新的URI,以后应使用资源现在所指的URI。
- 302 Found : 临时性重定向,表示请求的资源已被分配了新的URI,希望用户本次能使用新的URI访问
- 303 See Other : 表示由于请求对应的资源存在着另一个URI,应使用GET方法定向获取请求的资源。
- 304 Not Modified : 表示客户端发送附带条件的请求时,服务端允许请求访问资源,但未满足条件的情况。
- 307 Temporary Redirect : 临时重定向
4xx - 客户端错误
- 400 Bad Request : 请求报文中存在语法错误,当错误发生时,需修改请求的内容后再次发送请求。
- 401 Unauthorized : 表示发送的请求需要有同感HTTP认证的认证信息。
- 403 Forbidden : 表明对请求资源的访问被服务器拒绝了。例如未获取到文件系统的访问权限
- 404 Not Found : 表明服务器上无法找到请求的资源。
5xx - 服务器错误
- 500 Internal Server Error : 服务器端在执行请求时发生了错误。
- 503 Service Unavailable :表明服务器暂时处于超负载或正在进行停机去维护,现在无法处理请求。
第五章:与 HTTP 协作的 Web 服务器
一台 Web 服务器可搭建多个独立域名的 Web 网站,也可作为通信路径上的中转服务器提升传输速率
代理
代理是一种由转发功能的应用程序,扮演了位于服务器和客户端中间人的角色,接收由客户端发送的请求并转发给服务器,同时也接收服务器返回的响应并转发给客户端
分缓存代理(缓存从源服务器获取的数据)和透明代理(对请求不做任何加工)网关
网关是转发其他服务器通信数据的服务器,接收从客户端发送来的请求时,它像自己拥有资源的源服务器一样对请求进行处理。
工作机制和代理类似,而网关能够使通信线路上的服务器提供非HTTP协议服务。利用网关能够提高通信的安全性,因为可以在客户端与网关之间的通信线路上加密以确保连接的安全。隧道
隧道是在相隔甚远的客户端和服务器两者之间进行中转,并保持双方通信连接的应用程序。
可按要求建立一条与其他服务器的通信线路,届时使用 SSL 等加密手段进行通信。隧道的目的是确保客户端与服务器进行安全的通信。第六章:HTTP首部
HTTP 协议的请求和响应报文中必含HTTP首部,首部内容为客户端和服务器分别处理请求和响应提供所需要的信息。
请求报文
HTTP请求报文由:方法,URI,HTTP版本,HTTP首部字段等部分构成。
响应报文
HTTP响应报文由:HTTP版本,状态码(数字和原因短语),HTTP首部字段等3部分构成。
HTTP首部字段
首部字段由首部字段名和字段值构成,中间用冒号 :分割。
例如HTTP首部中以 Content-Type 这个字段来表示报文主体的对象类型。通用首部字段
请求首部字段
响应首部字段
实体首部字段
其他首部字段: HTTP 首部字段是可以自行扩展的
第七章:确保Web安全的HTTPS
HTTP 的缺点
- 通信使用明文(不加密),内容可能会被窃听
- 不验证通信方的身份,因此有可能遭遇伪装
- 无法证明报文的完整性,所以有可能已遭篡改
####加密处理防止被窃听
通信的加密
HTTP 协议中没有加密机制,但可以通过和SSL(Secure Socket Layer,安全套接层)或 TLS(Transport Layer Security,安全传输层协议)的组合使用,加密HTTP的通信内容。
用SSL建立安全通信线路之后,就可以在这条线路上进行HTTP通信的。与SSL组合使用的HTTP被称为 HTTPS(HTTP Secure,超文本传输安全协议)
内容的加密
通过使用证书,以证明通信方就是意料中的服务器。
HTTP+加密+认证+完整性保护 = HTTPS
通常,HTTP直接和TCP通信,当使用 SSL 时,则演变成先和 SSL 通信,再由SSL 和 TCP 通信了。
SSL 是独立于HTTP的协议,所以不光是HTTP协议,其他运行在应用层的SMTP和Telnet等协议均可配合SSL协议使用。可以说 SSL 是当今世界上应用最为广泛的网络安全技术。
HTTPS 采用共享密钥加密和公开密钥加密两者并用的混合加密机制。
使用SSL速度不可避免的会变慢:1.通信慢 2.大量消耗CPU和内存等资源,导致处理速度变慢。
第八章:确认访问用户身份的认证
认证的几种常见方式:
- 密码:只有本人才会知道的字符串信息
- 动态令牌:仅限本人持有的设备内显示的一次性密码
- 数字证书:仅限本人(终端)持有的信息
- 生物认证:指纹和虹膜等本人的生理信息
- IC卡等:仅限本人持有的信息
HTTP/1.1 使用的认证方式:
- BASIC认证(基本认证)
- DIGEST认证(摘要认证)
- SSL客户端认证
- FormBase认证(基于表单认证)
第九章:基于HTTP的功能追加协议
使用HTTP协议存在如下瓶颈:
- 一条连接上只可发送一个请求
- 请求只能从客户端开始,客户端不可以接收除响应以外的指令
- 请求/响应首部未经压缩就发送。首部信息越多延迟越大
- 发送冗长的首部,每次互相发送相同的首部造成的浪费较多
- 可任意选择数据压缩格式。非强制压缩发送
Ajax 的解决方法
Ajax(Asynchronous JavaScript and XML, 异步JavaScript与XML技术) 是一种有效利用JavaScript 和 DOM(Document Object Model) 的操作,以达到局部Web页面替换加载的异步通信手段。由于它只更新一部分界面,响应中传输的数据量会因此而减少。
Comet 的解决方法
通常,服务端接收到请求,在处理完毕后就会立即返回响应,但为了实现推送功能,Comet会先将响应置于挂起状态,当服务端有内容更新时,再返回该响应。因此,服务端一旦有更新,就可以立即反馈给客户端。
SPDY 的目标
SPDY 没有完全改写HTTP协议,而是再TCP/IP的应用层与传输层之间通过新加会话层的形式运作。同时,考虑到安全性问题,SDPY规定通信中使用SSL。
SDPY的设计图示
使用 SDPY后,HTTP协议额外获得以下功能:
多路复用流
通过单一的TCP连接,可以无限制处理多个HTTP请求。所有请求的处理都在一条TCP连接上完成,因此TCP处理效率得到提高
赋予请求优先级
压缩HTTP首部
推送功能
服务器提示功能
服务器可以主动提示客户端请求所需的资源。
WebSocket
Web 浏览器与 Web 服务器之间全双工通信标准。一旦Web服务器与客户端之间建立起 WebSocket 协议的通信连接,之后所有的通信都依赖这个专用协议进行,通信过程中可互相发送JSON,XML,HTML或图片等任意格式的数据。
WebSocket 通信的主要特点:
- 推送功能
- 减少通信量
第十章:构建Web内容的技术
HTML (HyperText Markup Language,超文本标记语言)。
CSS(Cascading Style Sheets,层叠样式表),可以指定如何展现HTML内的各种元素,属于样式表标准之一。
动态HTML(Dynamic HTML)
通过调用客户端脚本语言JavaScript,实现对HTML的Web页面的动态改造。利用 DOM(Document Object Model,文档对象模型)可指定欲发生动态变化的HTML元素。
Web应用
数据发布的格式及语言·
- XML
- RSS
- JSON
第十一章:Web的攻击技术
HTTP 不具备必要的安全功能
SQL注入攻击
对Web应用使用的数据库,通过运行非法的SQL而产生的攻击。
HTTP首部注入攻击
攻击者通过在响应首部字段内插入换行,添加任意响应首部或主体的一种攻击。
- 设置任何Cookie信息
- 重定向至任意URL
- 显示任意的主体(HTTP响应截断攻击)
目标遍历攻击
对本无意公开的文件目录通过非法截断其目录路径后,达成访问目的的一种攻击。
因设置或设计上的缺陷引发的安全漏洞
密码破解
算出密码,突破认证
DoS攻击
一种让运行中的服务呈停止状态的攻击。
- 集中利用访问请求造成资源过载,资源用尽的同时,实际上服务也就呈停止状态
- 通过攻击安全漏洞使服务停止
单纯来讲就是发生大量合法请求,服务器很难分辨何为正常请求,何为攻击请求,因此很难防止DoS攻击。
多态计算机发起的DoS攻击成为 DDoS攻击(Distributed Denial of Service attack)。 -
《计算机科学导论》读书笔记
2018-07-07 18:43:56 -
Python-正则表达式(读书笔记)
2020-06-26 00:52:54前言:《Python核心编程》读书笔记,我可太爱这本书了 文章目录什么是正则表达式元字符特殊字符使用圆括号指定分组(重点)扩展表示法看起来暂时不太清楚的语句截图方便复习Python的re使用 match()方法匹配字符串使用 ...前言:《Python核心编程》读书笔记,我可太爱这本书了,这篇读书笔记里面只记录了一些较为常用的板块,方便我以后复习查看!!!
文章目录
什么是正则表达式
我看来最大的作用就是,爬虫或者过滤非法字符
正则表达式为高级的文本模式匹配、抽取、与/或文本形式的搜索和替换功能提供了基础。
简单地说,正则表达式(简称为 regex)是一些由字符和特殊符号组成的字符串,它们描述了
模式的重复或者表述多个字符,于是正则表达式能按照某种模式匹配一系列有相似特征的字
符串。换句话说,它们能够匹配多个字符串……一种只能匹配一个字符串的正则
表达式模式是很乏味并且毫无作用的,不是吗?
Python 通过标准库中的 re 模块来支持正则表达式。本节将做一个简短扼要的介绍。元字符
表示法 描述 实例 literal 匹配文本字符串的字面值 literal foo re1|re2 匹配正则表达式 re1 或者 re2 foo/bar . 匹配任何字符(除了\n 之外) b.b ^ 匹配字符串起始部分 ^Dear $ 匹配字符串终止部分 /bin/*sh$ * 匹配 0 次或者多次前面出现的正则表达式 [A-Za-z0-9]* + 匹配 1 次或者多次前面出现的正则表达式 [a-z]+.com ? 匹配 0 次或者 1 次前面出现的正则表达式 goo? {N} 匹配 N 次前面出现的正则表达式 [0-9]{3} {M,N} 匹配 M~N 次前面出现的正则表达式 [0-9]{5,9} […] 匹配来自字符集的任意单一字符 [aeiou] […x−y…] 匹配 x~y 范围中的任意单一字符 [0-9], [A-Za-z] [^…] 不匹配此字符集中出现的任何一个字符,包括某一范围的字符(如果在此字符集中出现) [^aeiou], [^A-Za-z0-9] (*|+|?|{})? 用于匹配上面频繁出现/重复出现符号的非贪婪版本(*、+、?、{}) .*?[a-z] (…) 匹配封闭的正则表达式,然后另存为子组 ([0-9]{3})?,f(oo 特殊字符
使用圆括号指定分组(重点)
当使用正则表达式时,一对圆括号可以实现以下任意一个(或者两个)功能:
• 对正则表达式进行分组;
• 匹配子组。为什么匹配子组这么重要呢?主要原因是在很多时候除了进行匹配操作以外,我们还想要提取所匹配的模式。例如,如果决定匹配模式\w±\d+,但是想要分别保存第一部分的字母,和第二部分的数字,如果为两个子模式都加上圆括号,例如(\w+)-(\d+),然后就能够分别访问每一个匹配
子组。扩展表示法
看起来暂时不太清楚的语句截图方便复习
懂了匹配字符
Python的re
使用 match()方法匹配字符串
match()
函数试图从字符串的起始部分对模式进行匹配。如果匹配成功,就返回一个匹配对象;如果匹配失败,就返回 None,匹配对象的 group()方法能够用于显示那个成功的匹配import re a = re.match("aa\w*","aaaccc") print(a.group())
使用 search()在一个字符串中查找模式(搜索与匹配的对比)
其实,想要搜索的模式出现在一个字符串中间部分的概率,远大于出现在字符串起始部分的概率。这也就是 search()派上用场的时候了。search()的工作方式与 match()完全一致,不同之处在于 search()会用它的字符串参数,在任意位置对给定正则表达式模式搜索第一次出现的匹配情况。如果搜索到成功的匹配,就会返回一个匹配对象;否则,返回 None。
import re a = re.search("aa\w*","aaaccc") print(a) print(a.group())
group()与groups()
group()要么返回整个匹配对象,要么根据要求返回特定子组。groups()则仅返回一个包含唯一或者全部子组的元组。如果没有子组的要求,那么当group()仍然返回整个匹配时,groups()返回一个空元组。
匹配字符串的起始和结尾以及单词边界
-
C语言读书笔记
2017-09-27 14:29:05C语言深度解剖读书笔记 前段时间把c语言程序设计看了一遍,感觉还是有很多不清楚的地方,可能是使用的不多,而且学的也不够深得缘故吧。因为平时从事android开发,也希望能够把android系统方面的东西搞懂,那么... -
MongoDB数据库读书笔记
2017-05-23 17:51:35这里是我在第一次接触到MongoDB数据库的时候在网上查找资料的总结以及MongoDB权威指南的读书笔记,在这里将自己的记录传到百度云,希望可以帮到同样是刚入门或者是对MongoDB数据库感兴趣的同学,希望我的学习笔记... -
【读书笔记】乌合之众
2018-11-18 23:40:16读书笔记乌合之众思维导图 -
2018年读书笔记
2018-01-28 14:32:022018年读书笔记 新的一年即将开始,读书计划也将全面开启,所选择书籍讲围绕学习人类发展进化、科技的未来、商业转变等等。读书让人在智力上得到充实,书能让你完全了解一个论题,能让你比现在的大多数媒介更深入地... -
Machine Learning读书笔记
2015-10-10 23:20:59Machine Learning读书笔记 -
好用的读书笔记软件
2019-04-29 15:15:05读书笔记软件-Bullmind 1.支持做各种笔记。该功能是记笔记非常方便,并且有各种优化来记笔记。 2.支持多种快捷键定制,非常方便。包括颜色切换快捷方式。 3.书架支持无限制的细分,方便组织书籍。 4.您可以选择护眼... -
赋能之读书笔记
2018-04-07 20:27:23花了两周的时间,零零散散,终于看完了,启发的东西还是挺多的,所以整理了下读书笔记: -
华为项目管理法读书笔记
2019-07-23 13:25:28华为项目管理法读书笔记 -
2016年读书笔记
2015-12-26 16:10:502016年读书笔记新的一年即将开始,读书计划也将全面开启,所选择书籍讲围绕学习新文化、信仰、历史和科技。读书让人在智力上得到充实,书能让你完全了解一个论题,能让你比现在的大多数媒介更深入地沉浸其中。同时在... -
黑客与画家读书笔记
2017-08-30 23:41:48黑客与画家读书笔记思维导图 -
【读书笔记】刻意练习
2018-11-21 22:48:25刻意练习读书笔记思维导图 -
《编程匠艺》读书笔记
2014-11-16 18:25:00《编程匠艺》读书笔记之一 《编程匠艺》读书笔记之二 《编程匠艺》读书笔记之三 《编程匠艺》读书笔记之四 《编程匠艺》读书笔记之五 《编程匠艺》读书笔记之六 《编程匠艺》读书笔记之七 《编程匠艺》读书... -
金字塔原理--读书笔记
2019-07-01 14:51:05所以这个月先记录一下读书笔记吧,说不定以后用的上。 附上《金字塔原理》pdf 链接 提取码:1ueo 金字塔原理的基本概念 金字塔原理是一种重点突出,逻辑清晰,层次分明,简单易懂的思考方式、沟通方式、规范动作 ... -
好用的读书笔记app精选
2019-01-21 14:23:51或者是记录一下读过的书,或者是分享一下读书感悟,总之读书笔记还是很必要的一项环节。 下面就是今天的主角——流书。 【精彩片段 书摘分享】 流书的页面十分精简,采用卡片式书摘分享模式, 直接明了,方便阅读... -
“如何有效阅读一本书”读书笔记
2018-12-26 21:19:47目录 第一章:用笔记管理读书生活 ...读书笔记。 只要坚持就一定会有效:好记性不如烂笔头;将来总有一天你能用到的知识储备。 通过读书笔记养成良好的读书习惯:养成习惯;放大读书笔记的作用;创造别具一... -
读书笔记 读书 要么健身要么读书,别再说无聊>>
2017-02-06 17:12:47读书笔记 读书 要么健身要么读书,别再说无聊>> -
《流畅的Python》读书笔记
2018-07-26 00:16:14《流畅的Python》 读书笔记1-序列 《流畅的Python》读书笔记2-函数的参数 《流畅的Python》读书笔记3-operator模块和functools模块 《流畅的Python》读书笔记4-函数装饰器和闭包详解 为什么看这本书? 很早就... -
《C#7.0 核心技术指南》读书笔记
2019-12-02 22:15:59《C#7.0 核心技术指南》读书笔记(一) ------ 简介 《C#7.0 核心技术指南》读书笔记(二) ------ 基础 《C#7.0 核心技术指南》读书笔记(三) ------ 类 《C#7.0 核心技术指南》读书笔记(四) ------ ... -
《第一行代码》读书笔记(二)
2020-03-14 20:34:48《第一行代码》读书笔记(二)《第一行代码》读书笔记(二)5.2 开机广播不响应问题6.2 Android Device Monitor找不到使用旧有的monitor使用新添加的工具LitePal依赖6.5 DataSupport类DataSupport类找不到deleteAll... -
深入浅出Nodejs读书笔记
2017-02-06 14:35:06深入浅出Nodejs读书笔记 -
Python-Socket编程(读书笔记)
2020-06-26 22:42:49我这个是个简单的读书笔记,目的只是为了让自己养成一种记录的习惯,毕竟咋也只是刚刚开始,没那么多自己能写的东西,希望通过这种方式督促自己的学习; 文章目录socket基本用法关于listen(n)内置方法一个简单的例子... -
HeadFirst JavaScript读书笔记
2017-07-17 10:30:35HeadFirst JavaScript读书笔记 1. 存储数据——HeadFirst JavaScript第二章 2. 探索客户端——HeadFirst JavaScript第三章 -
大学 ·「读书笔记」
2020-03-17 12:22:02Java程序设计基础作业目录(作业笔记) 第1章 Java程序设计基础笔记 • 【第1章 初识Java】 第2章 Java程序设计基础笔记 • 【第2章 变量与数据类型】 第3章 Java程序设计基础笔记 • 【第3章 运算符与表达式... -
有哪些好用的读书笔记app
2018-11-20 15:04:24首先需要明辨的是笔记app和读书笔记app是有很大的差别,大部分的笔记app都是生活办公中使用,而且这类app要么分高级账号,要么按月按年收费。 再就是专门单独做读书笔记的app也很少,大部分都是放在阅读软件里面去... -
编程之美读书笔记
2013-04-02 11:25:54《编程之美》读书笔记23: 1.1 让CPU占用率曲线听你指挥 《编程之美》读书笔记01: 1.2 中国象棋将帅问题 《编程之美》读书笔记02: 1.3 一摞烙饼的排序* 《编程之美》读书笔记03: 1.4 买书...
-
anaconda + torch1.2 + pycharm
-
LeetCode-199-二叉树的右视图
-
电子时钟protues仿真及程序.rar
-
SpringBoot 自动装配原理
-
SAP SD组织架构定义和分配.xlsx
-
【数据分析-随到随学】Spark理论及实战
-
织梦post登录发布.zip
-
【数据分析-随到随学】Hadoop数据分析
-
详细介绍 安装ns3步骤
-
要为自己的未来花些钱,花5千学自动化,花得漂亮,才能活得精致...
-
参照AUTOSAR标准的SmartOSEKOS4_0的设计与实现.caj
-
RC522-RFID门禁刷卡自动识别系统(原理图源程序论文等)
-
sample_code_temp.rar
-
基于STM32+W5500, 移植Ethernet文件并基于NTP实现RTC对时更新,USART可实现DMA 接收任意长度数据-C代码类资源
-
实用工具-Server酱
-
算法很美课件algorithm.zip
-
第3章 你应该如何运行程序 (可选,Shell、IDE介绍,推荐看一下)
-
手势解锁-canvas-javascript实战
-
免费馅饼
-
【数据分析-随到随学】SPSS调查问卷统计分析