本文我们将介绍spawn类的基本方法expect方法,这个方法是用来匹配返回的结果,这个返回的结果是指子程序的返回结果,同时会将匹配的相关信息保存在spawn类的相关属性中。

  基本属性包括三个,第一个是before,是匹配点之前的文本,这里的匹配是指用expect这个方法来匹配的结果,那么匹配点之前的文本会放到before,这个实例属性中,并且我们要注意多次匹配时,不包括上次已匹配之前的内容。第二个after,它是用来保存匹配成功的内容,也是同样的是expect这个方法在进行匹配时,匹配成功的内容会放在after当中。第三个基本属性match,是用来保存已匹配的匹配对象,如果匹配不成功的话,就是none。

  特殊的匹配是指pexpect库当中一个的EOF,和TIMEOUT,这两个实际上是两个异常类,它们也可以用于在expect中进行匹配,另外我们再来看expect方法的使用方式,这个方法主要的参数包含pattern和timeout,从这个名称上可以看出来,timeout实际上就是超时的,pattern就是用于匹配的主要模式,对于这个可以是以下几种形式,可以为字符串,正则表达式,EOF,TIMEOUT,或者是以上类型的列表。用以匹配子命令返回的结果。从子命令返回结果中进行匹配,若只提供字符串等非列表,匹配成功返回0,若提供列表,则返回匹配成功的列表序号,匹配失败,则会引发异常。

  下面我们来看expect匹配方法的使用事例,首先启动虚拟机,进入python3,然后导入这个模块,首先我们要建立一个spawn事例,这个时候我们运行的是pexpect这个命令,列出当前目录下的目录以及文件,建立了spawn事例以后,我们就可以调用expect的方法来进行匹配。

  比如我们当前的目录下面有test这个文件,那么就可以尝试来匹配test。 直接调用这个类实例的expect方法。

  传递给他一个参数喂test,也就是之前的pattern参数,给它的值为test,然后从“ls -l”这个命令中来匹配test这个信息,那么返回值为0,表示匹配成功,如果我们要查询要匹配的结果,就可以使用spawn类的before属性或者after属性来查看,首先用before属性,输命令后出来的都是匹配以前的内容。那么匹配到什么信息,我们可以用after来查看,我们还可以通过调用它的match属性来查看匹配的结果,也就是正则对象,这个正则对象显示了接到的信息是从289到293。匹配的内容就是test,对于子程序返回的信息,我们还可以进行多次匹配。

  我们匹配到的test实际上在这个test后面ttt文件,我们也可以来匹配ttt,这个时候我们传入一个列表形式的参数。可以看到它返回的值为1,也就是说test已经匹配过了,它不会子程序返回信息的开头再次去匹配,而是从子程序匹配完之后的信息当中,进行匹配,所以它匹配到的是tt。

  我们也可以用before属性来进行查看,那么这是匹配之前的内容,匹配之前的内容当然不包括之前已经被匹配的内容,我们还可以同样的看到它的after,可以看到tt被匹配到了,当执行的匹配没有匹配成功的时候,它会抛出异常,比如我们刚刚的test,已经匹配完成了,如果我要再次匹配test。

  可以看到这个系统就输出了很多内容,就表示此时已经抛出了异常,也就是没有匹配到内容。

  这里的expect方法对pattern进行匹配,有一些和我们平常常用的正则表达式的匹配方式是有所不同的,因为它的匹配方式是从返回的信息中逐个字符读出,然后进行匹配,当pattern为列表的时候,从左至右哪个最先匹配到就匹配哪个。

  比如说我们仍然来做pexpect的匹配,然后我们来做这样一个匹配,输入代码,可以看到匹配的结果为1,也就是te被匹配到了,但是tt没有被匹配到,那么tt在我们刚刚列出的信息当中实际上是包含tt的,也包含了te,而且tt在te的后面,而在匹配的时候,因为它是被输出的信息从前到后进行匹配的,所以在列表当中的te被首先匹配到,因此它返回的1,而不是返回0。也就是说第二个先出现的字符串被匹配到,而第一个没有被匹配,这就是列表的匹配顺序。

  对于列表的匹配,我们还可以这样使用,比如,当我们在匹配结果信息的时候,如果不存在这个结果信息,那么程序就会抛出异常,中断运行,因此,我们还可以在列表中添加一个EOF这个项目,来使得匹配的时候不会退出程序。

  下面我们来看一个简单的例子,首先我们仍然先启动一个子程序, 由于这里面的命令只会输出当前命令下的所有文件和目录,如果我们要随意指定一个名称,可能它就会中断程序的执行,所以我们在匹配的时候,可以这样来做,输入命令后面加上EOF,这样我们就可以知道返回的结果,知道这个命令是否能够成功。由于这个abc是匹配不成功的,所以它匹配的就是第二个项目,所以返回的是1,因此这个程序并不会中断执行。如果我们要直接匹配abc,可以看到会匹配失败,程序会中断执行,这是列表的另外一种用法。

  在expect方法中进行匹配的时候,会自动应用re.DOTALL正则选项里面的“.+”可以匹配所有字符,“.*”返回空字符。如果在expect方法中,要匹配行尾,我们需要使用“r/n”,这个字符串,如果在正则表达式中使用“$”符号来匹配行尾,下面我们具体来看实例。

  首先我们要先看换行符的实例。

  我们运行的命令仍然是ls-l命令,匹配一个换行,用“/r/n”来表示,然后返回0表示匹配成功,我们可以查看匹配的结果,这就是匹配之前的内容,这个就是匹配到的换行符,我们还可以查看匹配的整个字符串,这是匹配行的方法,如果我们使用“.*”来进行匹配的话,对于返回信息的第一次匹配,“.*”号会返回一个控制符。

  输入代码进行匹配,匹配完成之后我们在进行“.*”的匹配,然后查看一下匹配的结果,可以看到它将剩下的所有的字符的结果全部匹配进去了,这就是“.*”用来匹配的特殊的情况,也就是在开始匹配和后天的匹配,结果是不同的。

  我们可以看到spawn这个类,它启动的子程序返回信息after类型,所以我们如果要匹配这里面的返回信息中的中文字符串,我们就需要把中文字符串进行编码,比如在这个桌面当中,有“公共”这个字符串,我们来匹配它,来查看一下。

  首先我们仍然先建立实例,进行ls这个命令,然后我们来匹配一下它的中文,掉用“encode”这个方法,用utf8来进行编码,然后查看匹配的结果,那么它就是一个字符串的形式,如果我们要看它真正的值,然后我们可以先将它进行解码,可以看到它就是“公共”这两个字,也就是说我们在这个地方进行中文匹配的时候,要对中文进行编码。

来源:麦子学院

原文链接:http://www.maiziedu.com/wiki/library/expect/

spawn类expect方法详解的更多相关文章

  1. spawn类参数command详解

    我们主要来看spawn类它的构造方法参数主要有command,从字面上就是指spawn类的子程序用来执行的子程序,也就是系统所能够执行的相应的命令,对于command这个参数,我们是以字符串的方式给出 ...

  2. Android之TelephonyManager类的方法详解

    TelephonyManager类主要提供了一系列用于访问与手机通讯相关的状态和信息的get方法.其中包括手机SIM的状态和信息.电信网络的状态及手机用户的信息.在应用程序中可以使用这些get方法获取 ...

  3. Object类中方法详解

    目录 概述 hashCode方法 getClass方法 toString方法 equals方法 clone方法 finalize方法 概述 Object 是类层次结构的根类.每个类都使用 Object ...

  4. TelephonyManager&GsmCellLocation类的方法详解

    转载:http://blog.163.com/zhangzheming_282/blog/static/117920962011101944356511/ TelephonyManager类 主要提供 ...

  5. Java中File类的方法详解

    File类也是Java中一个比较重要的类,通过他我们可以实现对文件的一系列操作,其内置了很多方法,下面我将按方法的功能分块,逐一讲解: 快速导航 构造方法 常用方法 创建目录 判断 `is...` t ...

  6. Delphi中TStringList类常用属性方法详解

    TStrings是一个抽象类,在实际开发中,是除了基本类型外,应用得最多的. 常规的用法大家都知道,现在来讨论它的一些高级的用法. 先把要讨论的几个属性列出来: 1.CommaText 2.Delim ...

  7. Python的Django框架中forms表单类的使用方法详解

    用户表单是Web端的一项基本功能,大而全的Django框架中自然带有现成的基础form对象,本文就Python的Django框架中forms表单类的使用方法详解. Form表单的功能 自动生成HTML ...

  8. ES6 类(Class)基本用法和静态属性+方法详解

    原文地址:http://blog.csdn.net/pcaxb/article/details/53759637 ES6 类(Class)基本用法和静态属性+方法详解 JavaScript语言的传统方 ...

  9. StringUtils类API及使用方法详解

    StringUtils类API及使用方法详解 StringUtils方法概览 判空函数 1)StringUtils.isEmpty(String str) 2)StringUtils.isNotEmp ...

随机推荐

  1. python,django,mysql学习之环境安装配置

    参考:https://docs.djangoproject.com/en/1.6/intro/tutorial01/ http://rainyang.blog.51cto.com/469543/115 ...

  2. 一个页面多个ng-app注意事项

    1.一个页面会自动加载第一个ng-app 2.如果想启动其它ng-app,需要通过下列代码的红色部分来启动,此时一共启动了2个ng-app 3.特别注意:代码红色部分一定要放在最后,比如,不能放在蓝色 ...

  3. Delphi 从PaintBox拷贝一部分内容到TBitmap

    将指定的TPaintBox内容(假如为paintbox1)拷贝到一个TBitmap(如Bitmap),可以这么做 Bitmap.Width := PaintBox1.Width; Bitmap.Hei ...

  4. 图片点击放大并可点击旋转插件(1)-jquery.artZoom.js

    1.首先加入链接: <script type="text/javascript" src="js/jquery-1.6.1.min.js">< ...

  5. HOJ - 2715最小费用流

    国庆八天乐,刷题也快乐. HOJ崩了,但是VJ可以把题目挂出来. 题目链接:https://vjudge.net/contest/188441#problem/A 涉及到矩阵里面的网络流,化为图来做. ...

  6. Javascript 评估用户输入密码的强度

    什么是一个安全的密码呢? 1.如果密码少于5位,那么就认为这是一个弱密码. 2.如果密码只由数字.小写字母.大写字母或其它特殊符号当中的一种组成,则认为这是一个弱密码. 3.如果密码由数字.小写字母. ...

  7. Leetcode总结之DFS

    package DFS; import java.util.ArrayList; import java.util.HashMap; import java.util.LinkedList; impo ...

  8. Jenkins使用Pipeline插件实现多个Job之间的串并联(教程收集)(待实践)

    在原始不使用插件时,在Jenkins我们要实现多个Job之间的连续集成时,我们一般的做法就是在每个Job上关联另一个Job,但是,这样做有个弊端,只能是连续的,如果要实现串或并联这样的,估计比较难:但 ...

  9. socket阻塞与非阻塞,同步与异步I/O模型

    作者:huangguisu 原文出处:http://blog.csdn.NET/hguisu/article/details/7453390 socket阻塞与非阻塞,同步与异步 1. 概念理解 在进 ...

  10. hdu 5389 Zero Escape (dp)

    题目:http://acm.hdu.edu.cn/showproblem.php? pid=5389 题意:定义数根:①把每一位上的数字加起来得到一个新的数,②反复①直到得到的数仅仅有1位.给定n,A ...