re模块和正则表达式,正则表达式应用
分类:计算机编程

正则表明式平日不经常用,日常都是用的时候,临渴掘井,查文书档案,然后就是被各类坑之后,才会逐渐熟谙。

re模块

os模块是与操作系统人机联作的叁个接口

  JavaScript是一门编制程序语言,浏览器内置了JavaScript语言的解释器,所以在浏览器上固守JavaScript语言的规规矩矩编写相应代码之,浏览器能够解释并做出相应的管理。是静态网页调换为动态的机要。

在线正则表明式测量试验:

讲正题早先大家先来看一个例证:

 

大器晚成、js的存在情势以致存放的地点

在线JSON格式化:

那是京东的挂号页面,打开页面我们就来看那些供给输入个人新闻的提示。
假定大家随便的在手提式有线电话机号码那豆蔻年华栏输入三个11111111111,它会唤起我们格式有误。
那几个效应是怎么贯彻的呢?
风度翩翩经以往您用python写意气风发段代码,形似:

图片 1

  1、JavaScript代码存在情势

正则表明式手册:

phone_number = input('please input your phone number : ')
'''
os.getcwd() 获取当前工作目录,即当前python脚本工作的目录路径
os.chdir("dirname")  改变当前脚本工作目录;相当于shell下cd
os.curdir  返回当前目录: ('.')
os.pardir  获取当前目录的父目录字符串名:('..')
os.makedirs('dirname1/dirname2')    可生成多层递归目录
os.removedirs('dirname1')    若目录为空,则删除,并递归到上一级目录,如若也为空,则删除,依此类推
os.mkdir('dirname')    生成单级目录;相当于shell中mkdir dirname
os.rmdir('dirname')    删除单级空目录,若目录不为空则无法删除,报错;相当于shell中rmdir dirname
os.listdir('dirname')    列出指定目录下的所有文件和子目录,包括隐藏文件,并以列表方式打印
os.remove()  删除一个文件
os.rename("oldname","newname")  重命名文件/目录
os.stat('path/filename')  获取文件/目录信息
os.sep    输出操作系统特定的路径分隔符,win下为"\",Linux下为"/"
os.linesep    输出当前平台使用的行终止符,win下为"tn",Linux下为"n"
os.pathsep    输出用于分割文件路径的字符串 win下为;,Linux下为:
os.name    输出字符串指示当前使用平台。win->'nt'; Linux->'posix'
os.system("bash command")  运行shell命令,直接显示
os.popen("bash command)  运行shell命令,获取执行结果
os.environ  获取系统环境变量

os.path

os.path.abspath(path) 返回path规范化的绝对路径 os.path.split(path) 将path分割成目录和文件名二元组返回 os.path.dirname(path) 返回path的目录。其实就是os.path.split(path)的第一个元素 os.path.basename(path) 返回path最后的文件名。如何path以/或结尾,那么就会返回空值。
                        即os.path.split(path)的第二个元素
os.path.exists(path)  如果path存在,返回True;如果path不存在,返回False
os.path.isabs(path)  如果path是绝对路径,返回True
os.path.isfile(path)  如果path是一个存在的文件,返回True。否则返回False
os.path.isdir(path)  如果path是一个存在的目录,则返回True。否则返回False
os.path.join(path1[, path2[, ...]])  将多个路径组合后返回,第一个绝对路径之前的参数将被忽略
os.path.getatime(path)  返回path所指向的文件或者目录的最后访问时间
os.path.getmtime(path)  返回path所指向的文件或者目录的最后修改时间
os.path.getsize(path) 返回path的大小
'''

图片 2图片 3

先来看下代码和周转效果啊

您怎么决断这一个phone_number是法定的吗?

图片 4

1 <!-- 方式一 -->
2 <script type"text/javascript" src="JS文件"></script>
3   
4 <!-- 方式二 -->
5 <script type"text/javascript">
6     Js代码内容
7 </script>
 string msg, rex;
            Match m;
            msg = "昨日总能耗0度。 (长沙市口腔医院)星期一【紫衡技术】";
            rex = @".*(昨日总?能耗)([0-9]{1,}[.]?[0-9]*)*度。 ((.*))(.{3}).*";
            m = Regex.Match(msg, rex);
            Console.WriteLine("0:"   m.Success);
            WriteGroupInfo(m);

            //1
            msg = @"上周总能耗28401.4度。 (沙井街道办)星期一【紫衡技术】";
             rex = @".*(上周总?能耗)([0-9]{1,}[.][0-9]*)*度。 ((.*))(.{3}).*";
            //昨日总能耗2582.1度。【长沙市天心区人民法院】2018 - 07 - 08【紫衡技术】
             m = Regex.Match(msg, rex);
            var r = m.Success;
            Console.WriteLine("1:" r);
            WriteGroupInfo(m);

            //2
            rex = @".*(昨日总?能耗)([0-9]{1,}[.]?[0-9]*)*度。【(.*)】(d{4}-d{2}-d{2}).*";
            msg= "昨日总能耗209.9度。【长沙市天心区人民检察院】2018-07-08【紫衡技术】";
            Match m1 = Regex.Match(msg, rex);
            Console.WriteLine("2:" m1.Success);
            WriteGroupInfo(m1);

            //3
            rex = @".*(上周总?能耗)([0-9]{1,}[.]?[0-9]*)*度。 ((.*))(.{3}).*";
            msg = "上周总能耗10922.4度。 (深圳市地方税务局第二稽查局)星期一【紫衡技术】";
            m1 = Regex.Match(msg, rex);
            Console.WriteLine("3:" m1.Success);
            WriteGroupInfo(m1);

            //4
            rex = @".*(上月总?能耗)([0-9]{1,}[.]?[0-9]*)*度。 ((.*))(.{8}).*";
            msg = "上月总能耗49276.9度。 (深圳市地方税务局第二稽查局)2018年06月【紫衡技术】";
            m1 = Regex.Match(msg, rex);
            Console.WriteLine("4:" m1.Success);
            WriteGroupInfo(m1);

            //5
            rex = @".*(建筑名称):(.*),在(d{4}-d{2}-d{2}).{3}([0-9]{1,}[.][0-9]*)*度。";
            msg = "建筑名称:长沙市天心区人民法院,在2018-07-08日用电2582.1度。";
            m1 = Regex.Match(msg, rex);
            Console.WriteLine("5:" m1.Success);
            WriteGroupInfo(m1);

            //6
            rex = @"(今日能耗):([0-9]{1,}[.]?[0-9]*)";
            msg = "今日能耗:300【紫衡技术】";
            m1 = Regex.Match(msg, rex);
            Console.WriteLine("6:"   m1.Success);
            WriteGroupInfo(m1);

            //^【([^】] )】异常(. ?)服务(【([^】] )】未找到或者未安装!)*(服务【([^】] )】未找到或者未安装!)*(服务【([^】] )】未找到或者未安装!)*(服务【([^】] )】未找到或者未安装!)
            //*(服务【([^】] )】未找到或者未安装!)*(服务【([^】] )】未找到或者未安装!)*(服务【([^】] )】未找到或者未安装!)*(服务【([^】] )】未找到或者未安装!)*. 
            rex = @"^【([^】] )】异常(. ?)服务(【([^】] )】未找到或者未安装!)*(服务【([^】] )】未找到或者未安装!)*(服务【([^】] )】未找到或者未安装!)*(服务【([^】] )】未找到或者未安装!)*
                 (服务【([^】] )】未找到或者未安装!)*(服务【([^】] )】未找到或者未安装!)*(服务【([^】] )】未找到或者未安装!)*(服务【([^】] )】未找到或者未安装!)*. ";
            msg = "【公司WNC服务监控台】异常 - 服务【Secom.Emx.SmsServer.Service】未找到或者未安装!【紫衡技术】";
            m1 = Regex.Match(msg, rex);
            Console.WriteLine("7:"   m1.Success);
            WriteGroupInfo(m1);
            Console.ReadKey();
        }

        private static void WriteGroupInfo(Match m)
        {
            var g = m.Groups;
            if (g.Count > 0)
            {
                for (var i = 0; i < g.Count; i  )
                {
                    Console.WriteLine(i ":" g[i].Value);
                }
            }
        }
根据手机号码一共11位并且是只以13、14、15、18开头的数字这些特点,我们用python写了如下代码: 

 

View Code

运维结果:

图片 5图片 6

 

  2、贮存地方

图片 7

while True:
    phone_number = input('please input your phone number : ')
    if len(phone_number) == 11 
            and phone_number.isdigit()
            and (phone_number.startswith('13') 
            or phone_number.startswith('14') 
            or phone_number.startswith('15') 
            or phone_number.startswith('18')):
        print('是合法的手机号码')
    else:
        print('不是合法的手机号码')

 

  

亟待小心的地点,待相配文字中的空格以及全角和半角字符要静心区分。

看清手提式有线电话机号码是或不是合法1

小心:os.stat('path/filename')  获取文件/目录音讯 的结构表明

  • HTML的head中
  • HTML的body代码块尾部(推荐)

仓库储存正则表明式字符串,无法积存到Json文件中,特殊字符会现身转义,存XML中并未有那几个难点。通过结构sql语句存款和储蓄到mysql中的时候,反斜杠将会被直接吃掉,所以插入早先要先进行转义。

这是你的写法,现在我要展示一下我的写法:

图片 8图片 9

  由于Html代码是从上到下执行,假若Head中的js代码耗费时间严重,就能引致客户长日子无从看出页面,即便放置在body代码块尾部,那么便是js代码耗费时间严重,也不会潜濡默化客户

 var _TemplateReg = v.Value.TemplateReg.Replace("\", "\\");

图片 10图片 11

图片 12

  查看页面。

在C#中\表示,\\就表示\。

import re
phone_number = input('please input your phone number : ')
if re.match('^(13|14|15|18)[0-9]{9}$',phone_number):
        print('是合法的手机号码')
else:
        print('不是合法的手机号码')
stat 结构:

st_mode: inode 保护模式
st_ino: inode 节点号。
st_dev: inode 驻留的设备。
st_nlink: inode 的链接数。
st_uid: 所有者的用户ID。
st_gid: 所有者的组ID。
st_size: 普通文件以字节为单位的大小;包含等待某些特殊文件的数据。
st_atime: 上次访问的时间。
st_mtime: 最后一次修改的时间。
st_ctime: 由操作系统报告的"ctime"。在某些系统上(如Unix)是最新的元数据更改的时间,在其它系统上(如Windows)是创建时间(详细信息参见平台的文档)。

  3、js的备考情势 

此前在三个全局变量中寄放了成百上千数据,现在自身须求将其储存到数据库中。原来的代码如下:

判定手提式有线电话机号码是或不是合法2

图片 13

  • 单行 //
  • 多行 /*  */

图片 14图片 15

对照上边的三种写法,一时,小编要问你你兴奋哪种方式呀?你早晚依然会说第风流倜傥种,为何呢?因为第意气风发种不用学呀!
但是借使明天有一个文件,笔者让您从全方位文件里相称出全数的手提式有线电话机号码。你用python给本身写个试试?
可是学了不久前的本事之后,分分钟帮您解决!

stat 结构

  4、外界引进的章程

        /// <summary>
        /// 短信模板
        /// </summary>
        #region old code
        Dictionary<string, SmsTemplate> templates = new Dictionary<string, SmsTemplate> {
            // 能耗日报模板  
            {
                "能耗提醒",
                new SmsTemplate {
                    TemplateCode = "SMS_139242133",
                    TemplateReg = @"测试短信通知",
                    TemplateParam =  new { name=string.Empty, date=string.Empty, energy=string.Empty },
                    SignName = "紫衡技术"
                }
            },
            {
                "测试",
                new SmsTemplate {
                    TemplateCode = "SMS_119091381",
                    TemplateReg = @"测试短信通知",
                    TemplateParam =  new { name=string.Empty, date=string.Empty, energy=string.Empty },
                    SignName = "紫衡技术"
                }
            },
            {
                "能耗",
                new SmsTemplate {
                    TemplateCode = "SMS_119076277",
                    TemplateReg = @"^[^(上周)|(上月)]*(能耗)值*[::]*([d.] ).*(([^)] ))(d{4}-d{2}-d{2}).*$",
                    TemplateParam =  new { name=string.Empty, date=string.Empty, energy=string.Empty },
                    SignName = "能耗报告"
                }
            },
            {
                "能耗Extend",
                new SmsTemplate
                {
                    TemplateCode = "SMS_128880488",
                    TemplateReg = @"^[^(上周)|(上月)]*(能耗)值*[::]*([d.] ).*(([^)] ))(d{4}-d{2}-d{2}).*$",
                    TemplateParam =  new { name=string.Empty, date=string.Empty, energy=string.Empty, extend=string.Empty},
                    SignName = "能耗报告"
                }
            },
            {
                "昨日能耗",
                new SmsTemplate {
                    TemplateCode = "SMS_139242142",
                    TemplateReg = @".*(昨日总?能耗)([0-9]{1,}[.]?[0-9]*)*度。 ((.*))(.{3}).*",//昨日总能耗16677.6度。 (天心区鑫远白天鹅酒店)星期一【紫衡技术】
                    TemplateParam =  new { name=string.Empty, date=string.Empty, energy=string.Empty },
                    SignName = "能耗报告"
                }
            },
             {
                "昨日能耗1",
                new SmsTemplate {
                    TemplateCode = "SMS_139242142",
                    TemplateReg = @".*(昨日总?能耗)([0-9]{1,}[.]?[0-9]*)*度。【(.*)】(d{4}-d{2}-d{2}).*",//昨日总能耗209.9度。【长沙市天心区人民检察院】2018-07-08【紫衡技术】
                    TemplateParam =  new { name=string.Empty, date=string.Empty, energy=string.Empty },
                    SignName = "能耗报告"
                }
            },
            {
                "上周能耗",
                new SmsTemplate {
                    TemplateCode = "SMS_119081757",
                    TemplateReg = @".*(上周总?能耗)值*[::]*([d.] ).*(([^)] ))(d{4}-d{2}-d{2}).*",
                    TemplateParam =  new { name=string.Empty, date=string.Empty, energy=string.Empty },
                    SignName = "能耗报告"
                }
            },
            {
                "上月能耗",
                new SmsTemplate {
                    TemplateCode = "SMS_119086386",
                    TemplateReg = @".*(上月总?能耗)值*[::]*([d.] ).*(([^)] ))(d{4}-d{2}-d{2}).*",
                    TemplateParam =  new { name=string.Empty, date=string.Empty, energy=string.Empty },
                    SignName = "能耗报告"
                }
            },
            {
                "定额",
                new SmsTemplate {
                    TemplateCode = "SMS_119076277",
                    TemplateReg = @".*(定额)值*[::]*([d.] ).*(([^)] ))(d{4}-d{2}-d{2}).*",
                    TemplateParam =  new { name=string.Empty, date=string.Empty, energy=string.Empty },
                    SignName = "能耗报告"
                }
            },
            {
                "基准",
                new SmsTemplate {
                    TemplateCode = "SMS_119076277",
                    TemplateReg = @".*(基准)值*[::]*([d.] ).*(([^)] ))(d{4}-d{2}-d{2}).*",
                    TemplateParam =  new { name=string.Empty, date=string.Empty, energy=string.Empty },
                    SignName = "能耗报告"
                }
            },
            {
                "节能量",
                new SmsTemplate {
                    TemplateCode = "SMS_119076277",
                    TemplateReg = @".*(节能量)值*[::]*([d.] ).*(([^)] ))(d{4}-d{2}-d{2}).*",
                    TemplateParam =  new { name=string.Empty, date=string.Empty, energy=string.Empty },
                    SignName = "能耗报告"
                }
            },
            {
                "优化",
                new SmsTemplate {
                    TemplateCode = "SMS_119076277",
                    TemplateReg = @".*(优化)值*[::]*([d.] ).*(([^)] ))(d{4}-d{2}-d{2}).*",
                    TemplateParam =  new { name=string.Empty, date=string.Empty, energy=string.Empty },
                    SignName = "能耗报告"
                }
            },
            // 报警日报模板
            {
                "报警",
                new SmsTemplate {
                    TemplateCode = "SMS_119076278",
                    TemplateReg = @"(建筑[)*(. ?)([],,])*产生以下报警:(. )(【紫衡技术】)",
                    TemplateParam =  new { name=string.Empty, date=string.Empty, alarm=string.Empty },
                    SignName = "能管系统报警"
                }
            },
            // 运维工单模板
            {
                "运维通知",
                new SmsTemplate {
                    TemplateCode = "SMS_119091206",
                    TemplateReg = "您有一条新的(. )工单需处理【工单号[::]([^】] ). ",
                    TemplateParam =  new { type=string.Empty, code=string.Empty },
                    SignName = "运维系统"
                }
            },
            {
                "运维抢单",
                new SmsTemplate {
                    TemplateCode = "SMS_119076276",
                    TemplateReg = "您有一条新的(. )工单(提示)*【工单号[::]([^】] ). ",
                    TemplateParam =  new { type=string.Empty, code=string.Empty },
                    SignName = "运维系统"
                }
            },
            {
                "运维派单",
                new SmsTemplate {
                    TemplateCode = "SMS_119076273",
                    TemplateReg =  "您有新的(. )工单无人[抢|接]单【工单号[::]([^】] ). ",
                    TemplateParam =  new { type=string.Empty, code=string.Empty },
                    SignName = "运维系统"
                }
            },
            {
                "库存不足",
                new SmsTemplate {
                    TemplateCode = "SMS_119091203",
                    TemplateReg =  ". 【([^】] )】. 库存已不足. ",
                    TemplateParam =  new { type=string.Empty, code=string.Empty },
                    SignName = "运维系统"
                }
            },
            {
                "维修签到",
                new SmsTemplate {
                    TemplateCode = "SMS_119076712",
                    TemplateReg =  ".*您有(.*)未签到【工单号:([^】] )】. ",
                    TemplateParam =  new { type=string.Empty, code=string.Empty },
                    SignName = "运维系统"
                }
            }

            ,
            {
                "报警抢单",
                new SmsTemplate {
                    TemplateCode = "SMS_119091869",
                    TemplateReg =  "您有(.*)报警.*无人[抢|接]单【工单号[::]([^】] ). ",
                    TemplateParam =  new { type=string.Empty, code=string.Empty },
                    SignName = "运维系统"
                }
            }
            ,
            {
                "广医派工",
                new SmsTemplate {
                    TemplateCode = "SMS_135795374",
                    TemplateReg =  "您有新的(. )工单(. )需处理,详情请打开“智慧机电运维系统APP”查看。",
                    TemplateParam =  new { type=string.Empty, code=string.Empty },
                    SignName = "运维系统"
                }
            }
            ,
            {
                "报警签到",
                new SmsTemplate {
                    TemplateCode = "SMS_119081998",
                    TemplateReg =  "您有(.*)报警事件未现场签到【工单号[::]([^】] ). ",
                    TemplateParam =  new { type=string.Empty, code=string.Empty },
                    SignName = "运维系统"
                }
            },
            {
                "未处理完崔单",
                new SmsTemplate {
                    TemplateCode = "SMS_119076997",
                    TemplateReg =  "您有(.*)处理尚未完成【工单号[::]([^】] ). ",
                    TemplateParam =  new { type=string.Empty, code=string.Empty },
                    SignName = "运维系统"
                }
            },
            {
                "运维崔单",
                new SmsTemplate {
                    TemplateCode = "SMS_119087014",
                    TemplateReg =  "您有一条(. )催单提示【工单号[::]([^】] ). ",
                    TemplateParam =  new { type=string.Empty, code=string.Empty },
                    SignName = "运维系统"
                }
            },
            {
                "运维工单事件",
                new SmsTemplate {
                    TemplateCode = "SMS_119091936",
                    TemplateReg =  "您有新的工单事件【工单号[::]([^】] ). ",
                    TemplateParam =  new { type=string.Empty, code=string.Empty },
                    SignName = "运维系统"
                }
            },
            {
                "MAN服务未找到异常",
                new SmsTemplate {
                    TemplateCode = "SMS_120120306",
                    TemplateReg =  "^【([^】] )】异常(. ?)服务(【([^】] )】未找到或者未安装!)*(服务【([^】] )】未找到或者未安装!)*(服务【([^】] )】未找到或者未安装!)*(服务【([^】] )】未找到或者未安装!)*(服务【([^】] )】未找到或者未安装!)*(服务【([^】] )】未找到或者未安装!)*(服务【([^】] )】未找到或者未安装!)*(服务【([^】] )】未找到或者未安装!)*. ",
                    TemplateParam =  new { type=string.Empty, code=string.Empty },
                    SignName = "能管365"
                }
            }

        };
        #endregion

前天大家要读书python里的re模块和正则表达式,学会了这几个就足以帮大家减轻刚刚的问号。正则表明式不仅仅在python领域,在一切编制程序届都据有主要的身份。

 

图片 16图片 17

View Code

图片 18图片 19

回去顶上部分

1 <script type="text/javascript" src="JS文件"></script>

本人想直接通过代码来机关将其搬迁到mysql数据库中去。

不管以后你是不是去做python开发,只要你是一个程序员就应该了解正则表达式的基本使用。如果未来你要在爬虫领域发展,你就更应该好好学习这方面的知识。
但是你要知道,re模块本质上和正则表达式没有一毛钱的关系。re模块和正则表达式的关系 类似于 time模块和时间的关系
你没有学习python之前,也不知道有一个time模块,但是你已经认识时间了 12:30就表示中午十二点半(这个时间可好,一般这会儿就该下课了)。
时间有自己的格式,年月日时分秒,12个月,365天......已经成为了一种规则。你也早就牢记于心了。time模块只不过是python提供给我们的可以方便我们操作时间的一个工具而已

sys模块

View Code

        /// <summary>
        /// 初始化数据,将原来代码中的模板配置生成并加载到数据库中
        /// </summary>
        /// <param name="templates"></param>
        /// <returns></returns>
        public int InitData(Dictionary<string, SmsTemplate> templates)
        {
            StringBuilder sb = new StringBuilder();
            sb.Append("INSERT INTO smstemplate VALUES");
            foreach(var v in templates)
            {
                var _TemplateReg = v.Value.TemplateReg.Replace("\", "\\");
                sb.AppendFormat(@"('{0}','{1}','{2}','{3}','{4}'),",v.Key,v.Value.TemplateCode, _TemplateReg, JsonConvert.SerializeObject(v.Value.TemplateParam),v.Value.SignName);
            }
            string sql= sb.ToString().TrimEnd(',');
            var cmd = db.GetSqlStringCommand(sql);
            return db.ExecuteNonQuery(cmd);
        }
        /// <summary>
        /// 从数据库中加载模板配置列表
        /// </summary>
        /// <returns>模板配置列表</returns>
        public Dictionary<string, SmsTemplate> GetSmsTemplate()
        {
            Dictionary<string, SmsTemplate> dic = new Dictionary<string, SmsTemplate>();
            var sql = "SELECT `Key`,`TemplateCode`,`TemplateReg`,`TemplateParam`,`SignName` FROM smstemplate";
            try
            {
                var cmd = db.GetSqlStringCommand(sql);
                SmsTemplate item;
                string key;
                using (var reader = db.ExecuteReader(cmd))
                {
                    while (reader.Read())
                    {
                        key = reader.GetString(0);
                        item = new SmsTemplate();
                        item.TemplateCode = reader.GetString(1);
                        item.TemplateReg = reader.GetString(2);
                        item.TemplateParam = (JObject)JsonConvert.DeserializeObject(reader.GetString(3));
                        item.SignName = reader.GetString(4);
                        dic.Add(key, item);
                    }
                }
            }
            catch(Exception ex)
            {
                throw new Exception(ex.Message);
            }

            return dic;
        }

构造完成后的sql脚本:

正则表达式和re模块

sys模块是与python解释器交互作用的一个接口

二、变量

图片 20图片 21

正则表明式

一说准绳自身曾经精晓你很晕了,将来就让大家先来看有的实际的选择。在线测验工具 

首先你要知道的是,谈到正则,就只和字符串相关了。在我给你提供的工具中,你输入的每一个字都是一个字符串。
其次,如果在一个位置的一个值,不会出现什么变化,那么是不需要规则的。
  比如你要用"1"去匹配"1",或者用"2"去匹配"2",直接就可以匹配上。这连python的字符串操作都可以轻松做到。
那么在之后我们更多要考虑的是在同一个位置上可以出现的字符的范围。

字符组 : [字符组]
在同一个位置可能出现的各种字符组成了一个字符组,在正则表达式中用[]表示
字符分为很多类,比如数字、字母、标点等等。
假如你现在要求一个位置"只能出现一个数字",那么这个位置上的字符只能是0、1、2...9这10个数之一。
正则
待匹配字符
匹配
结果
说明
[0123456789]
8
True
在一个字符组里枚举合法的所有字符,字符组里的任意一个字符
和"待匹配字符"相同都视为可以匹配
[0123456789]
a
False
由于字符组中没有"a"字符,所以不能匹配
 
[0-9]
 
7
True
也可以用-表示范围,[0-9]就和[0123456789]是一个意思
 
[a-z]
 
s
 
True
 
同样的如果要匹配所有的小写字母,直接用[a-z]就可以表示
 
[A-Z]
 
B
 
True
 
[A-Z]就表示所有的大写字母
 
[0-9][a-f][A-F]
 
e
 
True
 
可以匹配数字,大小写形式的a~f,用来验证十六进制字符
 
sys.argv           命令行参数List,第一个元素是程序本身路径
sys.exit(n)        退出程序,正常退出时exit(0),错误退出sys.exit(1)
sys.version        获取Python解释程序的版本信息
sys.path           返回模块的搜索路径,初始化时使用PYTHONPATH环境变量的值
sys.platform       返回操作系统平台名称

  JavaScript中变量的扬言是三个特别轻便出错的点,局地变量必需二个 var 起首,借使未采用var,则默许表示注明的是全局变量。

INSERT INTO smstemplate
VALUES
    (
        '能耗提醒',
        'SMS_139242133',
        '测试短信通知',
        '{"name":"","date":"","energy":""}',
        '紫衡技术'
    ),
    (
        '测试',
        'SMS_119091381',
        '测试短信通知',
        '{"name":"","date":"","energy":""}',
        '紫衡技术'
    ),
    (
        '能耗',
        'SMS_119076277',
        '^[^(上周)|(上月)]*(能耗)值*[::]*([\d.] ).*\(([^)] )\)(\d{4}-\d{2}-\d{2}).*$',
        '{"name":"","date":"","energy":""}',
        '能耗报告'
    ),
    (
        '能耗Extend',
        'SMS_128880488',
        '^[^(上周)|(上月)]*(能耗)值*[::]*([\d.] ).*\(([^)] )\)(\d{4}-\d{2}-\d{2}).*$',
        '{"name":"","date":"","energy":"","extend":""}',
        '能耗报告'
    ),
    (
        '昨日能耗',
        'SMS_139242142',
        '.*(昨日总?能耗)([0-9]{1,}[.]?[0-9]*)*度。 \((.*)\)(.{3}).*',
        '{"name":"","date":"","energy":""}',
        '能耗报告'
    ),
    (
        '昨日能耗1',
        'SMS_139242142',
        '.*(昨日总?能耗)([0-9]{1,}[.]?[0-9]*)*度。\【(.*)\】(\d{4}-\d{2}-\d{2}).*',
        '{"name":"","date":"","energy":""}',
        '能耗报告'
    ),
    (
        '上周能耗',
        'SMS_119081757',
        '.*(上周总?能耗)值*[::]*([\d.] ).*\(([^)] )\)(\d{4}-\d{2}-\d{2}).*',
        '{"name":"","date":"","energy":""}',
        '能耗报告'
    ),
    (
        '上月能耗',
        'SMS_119086386',
        '.*(上月总?能耗)值*[::]*([\d.] ).*\(([^)] )\)(\d{4}-\d{2}-\d{2}).*',
        '{"name":"","date":"","energy":""}',
        '能耗报告'
    ),
    (
        '定额',
        'SMS_119076277',
        '.*(定额)值*[::]*([\d.] ).*\(([^)] )\)(\d{4}-\d{2}-\d{2}).*',
        '{"name":"","date":"","energy":""}',
        '能耗报告'
    ),
    (
        '基准',
        'SMS_119076277',
        '.*(基准)值*[::]*([\d.] ).*\(([^)] )\)(\d{4}-\d{2}-\d{2}).*',
        '{"name":"","date":"","energy":""}',
        '能耗报告'
    ),
    (
        '节能量',
        'SMS_119076277',
        '.*(节能量)值*[::]*([\d.] ).*\(([^)] )\)(\d{4}-\d{2}-\d{2}).*',
        '{"name":"","date":"","energy":""}',
        '能耗报告'
    ),
    (
        '优化',
        'SMS_119076277',
        '.*(优化)值*[::]*([\d.] ).*\(([^)] )\)(\d{4}-\d{2}-\d{2}).*',
        '{"name":"","date":"","energy":""}',
        '能耗报告'
    ),
    (
        '报警',
        'SMS_119076278',
        '(建筑\[)*(. ?)([\],,])*产生以下报警:(. )(【紫衡技术】)',
        '{"name":"","date":"","alarm":""}',
        '能管系统报警'
    ),
    (
        '运维通知',
        'SMS_119091206',
        '您有一条新的(. )工单需处理【工单号[::]([^】] ). ',
        '{"type":"","code":""}',
        '运维系统'
    ),
    (
        '运维抢单',
        'SMS_119076276',
        '您有一条新的(. )工单(提示)*【工单号[::]([^】] ). ',
        '{"type":"","code":""}',
        '运维系统'
    ),
    (
        '运维派单',
        'SMS_119076273',
        '您有新的(. )工单无人[抢|接]单【工单号[::]([^】] ). ',
        '{"type":"","code":""}',
        '运维系统'
    ),
    (
        '库存不足',
        'SMS_119091203',
        '. 【([^】] )】. 库存已不足. ',
        '{"type":"","code":""}',
        '运维系统'
    ),
    (
        '维修签到',
        'SMS_119076712',
        '.*您有(.*)未签到【工单号:([^】] )】. ',
        '{"type":"","code":""}',
        '运维系统'
    ),
    (
        '报警抢单',
        'SMS_119091869',
        '您有(.*)报警.*无人[抢|接]单【工单号[::]([^】] ). ',
        '{"type":"","code":""}',
        '运维系统'
    ),
    (
        '广医派工',
        'SMS_135795374',
        '您有新的(. )工单(. )需处理,详情请打开“智慧机电运维系统APP”查看。',
        '{"type":"","code":""}',
        '运维系统'
    ),
    (
        '报警签到',
        'SMS_119081998',
        '您有(.*)报警事件未现场签到【工单号[::]([^】] ). ',
        '{"type":"","code":""}',
        '运维系统'
    ),
    (
        '未处理完崔单',
        'SMS_119076997',
        '您有(.*)处理尚未完成【工单号[::]([^】] ). ',
        '{"type":"","code":""}',
        '运维系统'
    ),
    (
        '运维崔单',
        'SMS_119087014',
        '您有一条(. )催单提示【工单号[::]([^】] ). ',
        '{"type":"","code":""}',
        '运维系统'
    ),
    (
        '运维工单事件',
        'SMS_119091936',
        '您有新的工单事件【工单号[::]([^】] ). ',
        '{"type":"","code":""}',
        '运维系统'
    ),
    (
        'MAN服务未找到异常',
        'SMS_120120306',
        '^【([^】] )】异常(. ?)服务(【([^】] )】未找到或者未安装!)*(服务【([^】] )】未找到或者未安装!)*(服务【([^】] )】未找到或者未安装!)*(服务【([^】] )】未找到或者未安装!)*(服务【([^】] )】未找到或者未安装!)*(服务【([^】] )】未找到或者未安装!)*(服务【([^】] )】未找到或者未安装!)*(服务【([^】] )】未找到或者未安装!)*. ',
        '{"type":"","code":""}',
        '能管365'
    )

字符:

 
元字符
 
匹配内容
匹配除换行符以外的任意字符
w 匹配字母或数字或下划线
s 匹配任意的空白符
d 匹配数字
n 匹配一个换行符
t 匹配一个制表符
b 匹配一个单词的结尾
^ 匹配字符串的开始
$ 匹配字符串的结尾
W
匹配非字母或数字或下划线
D
匹配非数字
S
匹配非空白符
a|b
匹配字符a或字符b
()
匹配括号内的表达式,也表示一个组
[...]
匹配字符组中的字符
[^...]
匹配除了字符组中字符的所有字符

 

图片 22图片 23

图片 24图片 25

View Code

量词:

量词
用法说明
* 重复零次或更多次
重复一次或更多次
? 重复零次或一次
{n} 重复n次
{n,} 重复n次或更多次
{n,m} 重复n到m次

 

import sys
try:
    sys.exit(1)
except SystemExit as e:
    print(e)
 1 <script type="text/javascript">
 2   
 3     // 全局变量
 4     name = 'nick';
 5   
 6     function func(){
 7         // 局部变量
 8         var age = 18;
 9   
10         // 全局变量
11         gender = "man"
12     }
13 </script>
JsonConvert.SerializeObject(v.Value.TemplateParam),把原来的对象进行序列化。
之前一直用的在线正则表达式匹配http://tool.oschina.net/regex/,不过发现不方便,于是我自己写了一个小工具。

源码下载:https://github.com/zouyujie/RegexTool
吐槽:阿里云的短信平台,短信模板中的单个变量长度不超过20个字符,而且还不支持组合变量,变量之间要用文字或者字符隔开,这样一来,假设我有需要发出去的变量文字是超过20个字符的,就不得不拆开,中间还要用字符或者汉字拆开,那么这样的话,客户收到的短信岂不是很奇葩,活生生的一些连续的描述文字被拆开了。
记录以备忘。

. ^ $

正则 待匹配字符 匹配
结果
说明
海. 海燕海娇海东 海燕海娇海东   匹配所有"海."的字符
^海. 海燕海娇海东 海燕 只从开头匹配"海."
  海.$   海燕海娇海东 海东 只匹配结尾的"海.$"

 

不行管理和status

View Code

* ? { }

正则 待匹配字符 匹配
结果
说明
李.? 李杰和李莲英和李二棍子

李杰
李莲
李二

 
?表示重复零次或一次,即只匹配"李"后面一个任意字符
 
李.* 李杰和李莲英和李二棍子 李杰和李莲英和李二棍子
*表示重复零次或多次,即匹配"李"后面0或多个任意字符
李. 李杰和李莲英和李二棍子 李杰和李莲英和李二棍子
 表示重复一次或多次,即只匹配"李"后面1个或多个任意字符
李.{1,2} 李杰和李莲英和李二棍子

李杰和
李莲英
李二棍

{1,2}匹配1到2次任意字符

 注意:前面的*, ,?等都以名缰利锁相称,相当于尽大概相配,前边加?号使其变为惰性相配

正则 待匹配字符 匹配
结果
说明
李.*? 李杰和李莲英和李二棍子

惰性匹配

 

 

三、数据类型

字符集[][^]

正则 待匹配字符 匹配
结果
说明
李[杰莲英二棍子]* 李杰和李莲英和李二棍子

李杰
李莲英
李二棍子

 
表示匹配"李"字后面[杰莲英二棍子]的字符任意次
 
李[^和]* 李杰和李莲英和李二棍子

李杰
李莲英
李二棍子

表示匹配一个不是"和"的字符任意次
[d] 456bdha3

4
5
6
3

表示匹配任意一个数字,匹配到4个结果
[d] 456bdha3

456
3

表示匹配任意个数字,匹配到2个结果

 

归来最上端

  

分组 ()与 或 |[^]

 身份ID号码是一个尺寸为15或二十个字符的字符串,倘若是16位则全体️数字组成,第3位不可能为0;假使是十七位,则前二拾一人意气风发体是数字,最后一位也许是数字或x,下边大家尝试用正则来代表:

正则 待匹配字符 匹配
结果
说明
^[1-9]d{13,16}[0-9x]$ 110101198001017032

110101198001017032

   表示可以匹配一个正确的身份证号
^[1-9]d{13,16}[0-9x]$ 1101011980010170

1101011980010170

表示也可以匹配这串数字,但这并不是一个正确的身份证号码,它是一个16位的数字
^[1-9]d{14}(d{2}[0-9x])?$ 1101011980010170

False

现在不会匹配错误的身份证号了
()表示分组,将d{2}[0-9x]分成一组,就可以整体约束他们出现的次数为0-1次
^([1-9]d{16}[0-9x]|[1-9]d{14})$ 110105199812067023

110105199812067023

表示先匹配[1-9]d{16}[0-9x]如果没有匹配上就匹配[1-9]d{14}

 

系列化模块

  JavaScript 中的数据类型分为原始类型和目的类型:

转义符

在正则表明式中,有非常多有特殊意义的是元字符,比方d和s等,假如要在正则中相称寻常的"d"实际不是"数字"就供给对""实行转义,形成'\'。

在python中,无论是正则表明式,依然待匹配的原委,都以以字符串的花样现身的,在字符串中也会有新鲜的意思,本身还索要转义。所以假如相配二遍"d",字符串中要写成'\d',那么正则里将在写成"\\d",那样就太费劲了。此时大家就用到了r'd'这些定义,那时的正则是r'\d'就足以了。

正则 待匹配字符 匹配
结果
说明
d d  False
因为在正则表达式中是有特殊意义的字符,所以要匹配d本身,用表达式d无法匹配
\d d  True
转义之后变成\,即可匹配
"\\d" '\d'  True
如果在python中,字符串中的''也需要转义,所以每一个字符串''又需要转义一次
r'\d' r'd'  True
在字符串之前加r,让整个字符串不转义

 

 

  • 原始类型
    • 数字
    • 字符串
    • 布尔值
  • 目的类型
    • 数组
    • “字典”

贪婪相配

雄心壮志匹配:在满意相称时,相配尽恐怕长的字符串,暗许境况下,接收贪婪相称

正则 待匹配字符 匹配
结果
说明
<.*>

<script>...<script>

<script>...<script>
默认为贪婪匹配模式,会匹配尽量长的字符串
<.*?> r'd'  

<script>
<script>

加上?为将贪婪匹配模式转为非贪婪匹配模式,会匹配尽量短的字符串

怎样叫体系化——将原来的字典、列表等剧情调换来一个字符串的经过就叫做序列化

  极其的,数字、布尔值、null、undefined、字符串是不可变。

多少个常用的非贪婪相配Pattern

*? 重复任意次,但尽可能少重复
 ? 重复1次或更多次,但尽可能少重复
?? 重复0次或1次,但尽可能少重复
{n,m}? 重复n到m次,但尽可能少重复
{n,}? 重复n次以上,但尽可能少重复

图片 26图片 27

// null、undefined
null是JavaScript语言的关键字,它表示一个特殊值,常用来描述“空值”。
undefined是一个特殊值,表示变量未定义。

.*?的用法

图片 28

. 是任意字符
* 是取 0 至 无限长度
? 是非贪婪模式。
何在一起就是 取尽量少的任意字符,一般不会这么单独写,他大多用在:
.*?x

就是取前面任意长度的字符,直到一个x出现

图片 29

图片 30

   1、数字

re模块下的常用方法

 

图片 31

import re

ret = re.findall('a', 'eva egon yuan')  # 返回所有满足匹配条件的结果,放在列表里
print(ret) #结果 : ['a', 'a']

ret = re.search('a', 'eva egon yuan').group()
print(ret) #结果 : 'a'
# 函数会在字符串内查找模式匹配,只到找到第一个匹配然后返回一个包含匹配信息的对象,该对象可以
# 通过调用group()方法得到匹配的字符串,如果字符串没有匹配,则返回None。

ret = re.match('a', 'abc').group()  # 同search,不过尽在字符串开始处进行匹配
print(ret)
#结果 : 'a'

ret = re.split('[ab]', 'abcd')  # 先按'a'分割得到''和'bcd',在对''和'bcd'分别按'b'分割
print(ret)  # ['', '', 'cd']

ret = re.sub('d', 'H', 'eva3egon4yuan4', 1)#将数字替换成'H',参数1表示只替换1个
print(ret) #evaHegon4yuan4

ret = re.subn('d', 'H', 'eva3egon4yuan4')#将数字替换成'H',返回元组(替换的结果,替换了多少次)
print(ret)

obj = re.compile('d{3}')  #将正则表达式编译成为一个 正则表达式对象,规则要匹配的是3个数字
ret = obj.search('abc123eeee') #正则表达式对象调用search,参数为待匹配的字符串
print(ret.group())  #结果 : 123

import re
ret = re.finditer('d', 'ds3sy4784a')   #finditer返回一个存放匹配结果的迭代器
print(ret)  # <callable_iterator object at 0x10195f940>
print(next(ret).group())  #查看第一个结果
print(next(ret).group())  #查看第二个结果
print([i.group() for i in ret])  #查看剩余的左右结果

图片 32

 

比如,我们在python代码中计算的一个数据需要给另外一段程序使用,那我们怎么给?
现在我们能想到的方法就是存在文件里,然后另一个python程序再从文件里读出来。
但是我们都知道,对于文件来说是没有字典这个概念的,所以我们只能将数据转换成字典放到文件中。
你一定会问,将字典转换成一个字符串很简单,就是str(dic)就可以办到了,为什么我们还要学习序列化模块呢?
没错序列化的过程就是从dic 变成str(dic)的过程。现在你可以通过str(dic),将一个名为dic的字典转换成一个字符串,
但是你要怎么把一个字符串转换成字典呢?
聪明的你肯定想到了eval(),如果我们将一个字符串类型的字典str_dic传给eval,就会得到一个返回的字典类型了。
eval()函数十分强大,但是eval是做什么的?e官方demo解释为:将字符串str当成有效的表达式来求值并返回计算结果。
BUT!强大的函数有代价。安全性是其最大的缺点。
想象一下,如果我们从文件中读出的不是一个数据结构,而是一句"删除文件"类似的破坏性语句,那么后果实在不堪设设想。
而使用eval就要担这个风险。
所以,我们并不推荐用eval方法来进行反序列化操作(将str转换成python中的数据结构)

  

【python】正则表明式-group和group的分别

正则表明式中,group(卡塔 尔(阿拉伯语:قطر‎用来提出分组截获的字符串,(卡塔尔国用来分组

1
2
3
4
5
6
7
8
 
import re
= "123abc456"
print re.search("([0-9]*)([a-z]*)([0-9]*)",a).group()   #123abc456
print re.search("([0-9]*)([a-z]*)([0-9]*)",a).group(0)  #123abc456
print re.search("([0-9]*)([a-z]*)([0-9]*)",a).group(1)  #123
print re.search("([0-9]*)([a-z]*)([0-9]*)",a).group(2)  #abc
print re.search("([0-9]*)([a-z]*)([0-9]*)",a).group(3)  #456
print re.search("([0-9]*)([a-z]*)([0-9]*)",a).groups()  #('123', 'abc', '456')

  上面正则表明式中的三组括号把相称结果分成三组

  •  group() 同group(0卡塔 尔(阿拉伯语:قطر‎就是同盟正则表明式全体结果
  •  group(1) 列出第三个括号匹配部分,group(2) 列出第三个括号相配部分,group(3) 列出第三个括号相配部分。
  • groups(卡塔 尔(阿拉伯语:قطر‎是把具有相称出来的分组参预元组中
 1
2
3
4
5
 
import re
= "123abc456"
print re.search("[0-9]*[a-z]*[0-9]*",a).group()   #123abc456
print re.search("[0-9]*[a-z]*[0-9]*",a).group(0)  #123abc456
print re.search("[0-9]*[a-z]*[0-9]*",a).groups()  #()

 当然正则表明式中绝非括号分组,group(1)和groups料定不对了。

 

注意:

图片 33

  vaScript中不区分整数值和浮点数值,JavaScript中具有数字均用浮点数值表示。

1 findall的优先级查询:

图片 34

import re

ret = re.findall('www.(baidu|oldboy).com', 'www.oldboy.com')
print(ret)  # ['oldboy']     这是因为findall会优先把匹配结果组里内容返回,如果想要匹配结果,取消权限即可

ret = re.findall('www.(?:baidu|oldboy).com', 'www.oldboy.com')
print(ret)  # ['www.oldboy.com']

图片 35

 

缘何要有系列化模块

  转换:

2 split的事先级查询

图片 36

ret=re.split("d ","eva3egon4yuan")
print(ret) #结果 : ['eva', 'egon', 'yuan']

ret=re.split("(d )","eva3egon4yuan")
print(ret) #结果 : ['eva', '3', 'egon', '4', 'yuan']

#在匹配部分加上()之后所切出的结果是不同的,
#没有()的没有保留所匹配的项,但是有()的却能够保留了匹配的项,
#这个在某些需要保留匹配部分的使用过程是非常重要的。

图片 37

 

类别化的目标

  • parseInt(..)    将某值转变到数字,不成功则NaN
  • parseFloat(..) 将某值转变到浮点数,不成事则NaN

练习

1、以某种存款和储蓄情势使自定义指标长久化;

  特殊值:

1、相称标签

图片 38图片 39

import re


ret = re.search("<(?P<tag_name>w )>w </(?P=tag_name)>","<h1>hello</h1>")
#还可以在分组中利用?<name>的形式给分组起名字
#获取的匹配结果可以直接用group('名字')拿到对应的值
print(ret.group('tag_name'))  #结果 :h1
print(ret.group())  #结果 :<h1>hello</h1>

ret = re.search(r"<(w )>w </1>","<h1>hello</h1>")
#如果不给组起名字,也可以用序号来找到对应的组,表示要找的内容和前面的组内容一致
#获取的匹配结果可以直接用group(序号)拿到对应的值
print(ret.group(1))
print(ret.group())  #结果 :<h1>hello</h1>

View Code

 

2、将指标从叁个地点传递到另叁个地点。

  •  NaN,非数字。可使用 isNaN(num) 来判断。
  • Infinity,无穷大。可使用 isFinite(num) 来判断。

2、相配整数

图片 40图片 41

import re

ret=re.findall(r"d ","1-2*(60 (-40.35/5)-(-4*3))")
print(ret) #['1', '2', '60', '40', '35', '5', '4', '3']
ret=re.findall(r"-?d .d*|(-?d )","1-2*(60 (-40.35/5)-(-4*3))")
print(ret) #['1', '-2', '60', '', '5', '-4', '3']
ret.remove("")
print(ret) #['1', '-2', '60', '5', '-4', '3']

View Code

 

3、使程序更具维护性。

  更加多划算数值

3、数字相称

图片 42图片 43

1、 匹配一段文本中的每行的邮箱
      http://blog.csdn.net/make164492212/article/details/51656638

2、 匹配一段文本中的每行的时间字符串,比如:‘1990-07-12’;

   分别取出1年的12个月(^(0?[1-9]|1[0-2])$)、
   一个月的31天:^((0?[1-9])|((1|2)[0-9])|30|31)$

3、 匹配qq号。(腾讯QQ号从10000开始)  [1,9][0,9]{4,}

4、 匹配一个浮点数。       ^(-?d )(.d )?$   或者  -?d .?d*

5、 匹配汉字。             ^[u4e00-u9fa5]{0,}$ 

6、 匹配出所有整数

View Code

 

图片 44

图片 45图片 46

4、爬虫练习

图片 47图片 48

import requests

import re
import json

def getPage(url):

    response=requests.get(url)
    return response.text

def parsePage(s):

    com=re.compile('<div class="item">.*?<div class="pic">.*?<em .*?>(?P<id>d ).*?(?P<title>.*?)'
                   '.*?(?P<rating_num>.*?).*?(?P<comment_num>.*?)评价',re.S)

    ret=com.finditer(s)
    for i in ret:
        yield {
            "id":i.group("id"),
            "title":i.group("title"),
            "rating_num":i.group("rating_num"),
            "comment_num":i.group("comment_num"),
        }

def main(num):

    url='https://movie.douban.com/top250?start=%s&filter='%num
    response_html=getPage(url)
    ret=parsePage(response_html)
    print(ret)
    f=open("move_info7","a",encoding="utf8")

    for obj in ret:
        print(obj)
        data=json.dumps(obj,ensure_ascii=False)
        f.write(data "n")

if __name__ == '__main__':
    count=0
    for i in range(10):
        main(count)
        count =25

View Code

 

 

 1 常量
 2 
 3 Math.E
 4 常量e,自然对数的底数。
 5 
 6 Math.LN10
 7 10的自然对数。
 8 
 9 Math.LN2
10 2的自然对数。
11 
12 Math.LOG10E
13 以10为底的e的对数。
14 
15 Math.LOG2E
16 以2为底的e的对数。
17 
18 Math.PI
19 常量figs/U03C0.gif。
20 
21 Math.SQRT1_2
22 2的平方根除以1。
23 
24 Math.SQRT2
25 2的平方根。
26 
27 静态函数
28 
29 Math.abs( )
30 计算绝对值。
31 
32 Math.acos( )
33 计算反余弦值。
34 
35 Math.asin( )
36 计算反正弦值。
37 
38 Math.atan( )
39 计算反正切值。
40 
41 Math.atan2( )
42 计算从X轴到一个点的角度。
43 
44 Math.ceil( )
45 对一个数上舍入。
46 
47 Math.cos( )
48 计算余弦值。
49 
50 Math.exp( )
51 计算e的指数。
52 
53 Math.floor( )
54 对一个数下舍人。
55 
56 Math.log( )
57 计算自然对数。
58 
59 Math.max( )
60 返回两个数中较大的一个。
61 
62 Math.min( )
63 返回两个数中较小的一个。
64 
65 Math.pow( )
66 计算xy。
67 
68 Math.random( )
69 计算一个随机数。
70 
71 Math.round( )
72 舍入为最接近的整数。
73 
74 Math.sin( )
75 计算正弦值。
76 
77 Math.sqrt( )
78 计算平方根。
79 
80 Math.tan( )
81 计算正切值。

json

Json模块提供了多个职能:dumps、dump、loads、load

图片 49图片 50

图片 51

import json
dic = {'k1':'v1','k2':'v2','k3':'v3'}
str_dic = json.dumps(dic)  #序列化:将一个字典转换成一个字符串
print(type(str_dic),str_dic)  #<class 'str'> {"k3": "v3", "k1": "v1", "k2": "v2"}
#注意,json转换完的字符串类型的字典中的字符串是由""表示的

dic2 = json.loads(str_dic)  #反序列化:将一个字符串格式的字典转换成一个字典
#注意,要用json的loads功能处理的字符串类型的字典中的字符串必须由""表示
print(type(dic2),dic2)  #<class 'dict'> {'k1': 'v1', 'k2': 'v2', 'k3': 'v3'}


list_dic = [1,['a','b','c'],3,{'k1':'v1','k2':'v2'}]
str_dic = json.dumps(list_dic) #也可以处理嵌套的数据类型 
print(type(str_dic),str_dic) #<class 'str'> [1, ["a", "b", "c"], 3, {"k1": "v1", "k2": "v2"}]
list_dic2 = json.loads(str_dic)
print(type(list_dic2),list_dic2) #<class 'list'> [1, ['a', 'b', 'c'], 3, {'k1': 'v1', 'k2': 'v2'}]

图片 52

loads和dumps

图片 53图片 54

图片 55

import json
f = open('json_file','w')
dic = {'k1':'v1','k2':'v2','k3':'v3'}
json.dump(dic,f)  #dump方法接收一个文件句柄,直接将字典转换成json字符串写入文件
f.close()

f = open('json_file')
dic2 = json.load(f)  #load方法接收一个文件句柄,直接将文件中的json字符串转换成数据结构返回
f.close()
print(type(dic2),dic2)

图片 56

load和dump

图片 57图片 58

图片 59

import json
f = open('file','w')
json.dump({'国籍':'中国'},f)
ret = json.dumps({'国籍':'中国'})
f.write(ret 'n')
json.dump({'国籍':'美国'},f,ensure_ascii=False)
ret = json.dumps({'国籍':'美国'},ensure_ascii=False)
f.write(ret 'n')
f.close()

图片 60

ensure_ascii关键字参数

 

View Code

pickle

 

  2、字符串

json & pickle 模块

 

用来系列化的多少个模块

 

  • json,用于字符串 和 python数据类型间开展调换
  • pickle,用于python特有的类型 和 python的数据类型间开展转换

 

pickle模块提供了几个效果与利益:dumps、dump(种类化,存卡塔尔、loads(反体系化,读卡塔 尔(阿拉伯语:قطر‎、load  (不只可以够系列化字典,列表...可以把python中随便的数据类型连串化

 

图片 61图片 62

图片 63

import pickle
dic = {'k1':'v1','k2':'v2','k3':'v3'}
str_dic = pickle.dumps(dic)
print(str_dic)  #一串二进制内容

dic2 = pickle.loads(str_dic)
print(dic2)    #字典

import time
struct_time  = time.localtime(1000000000)
print(struct_time)
f = open('pickle_file','wb')
pickle.dump(struct_time,f)
f.close()

f = open('pickle_file','rb')
struct_time2 = pickle.load(f)
print(struct_time2.tm_year)

图片 64

pickle

 

此刻机智的您又要说了,既然pickle如此强盛,为何还要学json呢?
此地大家要说贝因美(Beingmate卡塔 尔(阿拉伯语:قطر‎下,json是意气风发种具有的语言都足以辨别的数据结构。
假使大家将叁个字典也许类别化成了八个json存在文件里,那么java代码或然js代码也足以拿来用。
唯独借使我们用pickle进行连串化,其余语言就不能够读懂那是如何了~
据此,假若您系列化的剧情是列表大概字典,我们充裕推荐您采用json模块
但只借使因为某种原因你不能不连串化别的的数据类型,近年来后您还或者会用python对那些数量实行反体系化的话,那么就足以行使pickle

  

shelve

shelve也是python提需求大家的种类化学工业具,比pickle用起来更简便一些。
shelve只提供给我们多个open方法,是用key来访问的,使用起来和字典雷同。

图片 65图片 66

图片 67

import shelve
f = shelve.open('shelve_file')
f['key'] = {'int':10, 'float':9.5, 'string':'Sample data'}  #直接对文件句柄操作,就可以存入数据
f.close()

import shelve
f1 = shelve.open('shelve_file')
existing = f1['key']  #取出数据的时候也只需要直接用key获取即可,但是如果key不存在会报错
f1.close()
print(existing)

图片 68

shelve

以此模块有个节制,它不帮忙四个应用同一时间往同三个DB进行写操作。所以当我们知晓大家的施用假使只进行读操作,大家得以让shelve通过只读格局展开DB

图片 69图片 70

import shelve
f = shelve.open('shelve_file', flag='r')
existing = f['key']
f.close()
print(existing)

shelve只读

是因为shelve在暗中认可情形下是不会记录待持久化对象的其余改良的,所以我们在shelve.open()时候必要改良暗许参数,不然对象的改正不会保留。

图片 71图片 72

图片 73

import shelve
f1 = shelve.open('shelve_file')
print(f1['key'])
f1['key']['new_value'] = 'this was not here before'
f1.close()

f2 = shelve.open('shelve_file', writeback=True)
print(f2['key'])
f2['key']['new_value'] = 'this was not here before'
f2.close()

图片 74

设置writeback

writeback格局有独特之处也非凡。优点是裁减了我们失误的概率,并且让对象的持久化对客商越来越的晶莹了;但这种方法并非具备的景色下都急需,首先,使用writeback未来,shelf在open()的时候会大增额外的内部存款和储蓄器消耗,况兼当DB在close()的时候会将缓存中的每二个目的都写入到DB,那也会拉动十一分的等候时间。因为shelve未有艺术知道缓存中如何对象修正了,哪些对象未有更改,由此拥有的目标都会被写入。

 

回去最上端

re模块

讲正题以前大家先来看三个例子:

那是京东的注册页面,展开页面大家就来看这个必要输入个人音讯的提示。
比如大家随意的在手机号码那生机勃勃栏输入二个11111111111,它会提示大家格式有误。
以此效应是怎么贯彻的啊?
若是今后您用python写意气风发段代码,相似:

phone_number = input('please input your phone number : ')

你怎么判别这些phone_number是合法的啊?

根据手机号码一共11位并且是只以13、14、15、18开头的数字这些特点,我们用python写了如下代码:

图片 75图片 76

图片 77

while True:
    phone_number = input('please input your phone number : ')
    if len(phone_number) == 11 
            and phone_number.isdigit()
            and (phone_number.startswith('13') 
            or phone_number.startswith('14') 
            or phone_number.startswith('15') 
            or phone_number.startswith('18')):
        print('是合法的手机号码')
    else:
        print('不是合法的手机号码')

图片 78

决断手提式有线电话机号码是不是合法1

这是你的写法,现在我要展示一下我的写法:

图片 79图片 80

import re
phone_number = input('please input your phone number : ')
if re.match('^(13|14|15|18)[0-9]{9}$',phone_number):
        print('是合法的手机号码')
else:
        print('不是合法的手机号码')

看清手提式有线电话机号码是或不是合法2

看待下面的三种写法,一时一刻,作者要问您你喜欢哪类方法呀?你明显照旧会说第大器晚成种,为何吧?因为第生机勃勃种不用学呀!
只是生机勃勃旦今后有一个文书,小编让您从全数文件里相配出全数的手机号码。你用python给本人写个试试?
而是学了前日的技术之后,分分钟帮你化解!

明日我们要读书python里的re模块和正则表达式,学会了那么些就足以帮大家缓和刚刚的难题。正则表明式不仅仅在python领域,在一切编制程序届都挤占主要的身份。

图片 81图片 82

图片 83

不管以后你是不是去做python开发,只要你是一个程序员就应该了解正则表达式的基本使用。如果未来你要在爬虫领域发展,你就更应该好好学习这方面的知识。
但是你要知道,re模块本质上和正则表达式没有一毛钱的关系。re模块和正则表达式的关系 类似于 time模块和时间的关系
你没有学习python之前,也不知道有一个time模块,但是你已经认识时间了 12:30就表示中午十二点半(这个时间可好,一般这会儿就该下课了)。
时间有自己的格式,年月日时分秒,12个月,365天......已经成为了一种规则。你也早就牢记于心了。time模块只不过是python提供给我们的可以方便我们操作时间的一个工具而已

图片 84

正则表达式和re模块

正则表达式本人也和python未有怎么关系,便是相配字符串内容的黄金时代种法则

官方定义:正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑。

  字符串是由字符组成的数组,但在JavaScript中字符串是不可变的:可以访谈字符串任性地方的公文,可是JavaScript并没有提供更改已知字符串内容的章程。

正则表明式

一说法规本人早就精通你很晕了,今后就让咱们先来看有的事实上的施用。在线测量试验工具 

首先你要知道的是,谈到正则,就只和字符串相关了。在我给你提供的工具中,你输入的每一个字都是一个字符串。
其次,如果在一个位置的一个值,不会出现什么变化,那么是不需要规则的。
  比如你要用"1"去匹配"1",或者用"2"去匹配"2",直接就可以匹配上。这连python的字符串操作都可以轻松做到。
那么在之后我们更多要考虑的是在同一个位置上可以出现的字符的范围。

图片 85图片 86

字符组 : [字符组]
在同一个位置可能出现的各种字符组成了一个字符组,在正则表达式中用[]表示
字符分为很多类,比如数字、字母、标点等等。
假如你现在要求一个位置"只能出现一个数字",那么这个位置上的字符只能是0、1、2...9这10个数之一。

字符组

正则
待匹配字符
匹配
结果
说明
[0123456789]
8
True
在一个字符组里枚举合法的所有字符,字符组里的任意一个字符
和"待匹配字符"相同都视为可以匹配
[0123456789]
a
False
由于字符组中没有"a"字符,所以不能匹配
 
[0-9]
 
7
True
也可以用-表示范围,[0-9]就和[0123456789]是一个意思
 
[a-z]
 
s
 
True
 
同样的如果要匹配所有的小写字母,直接用[a-z]就可以表示
 
[A-Z]
 
B
 
True
 
[A-Z]就表示所有的大写字母
 
[0-9a-fA-F]
 
e
 
True
 
可以匹配数字,大小写形式的a~f,用来验证十六进制字符

字符:

 
元字符
 
匹配内容
匹配除换行符以外的任意字符
w 匹配字母或数字或下划线
s 匹配任意的空白符
d 匹配数字
n 匹配一个换行符
t 匹配一个制表符
b 匹配一个单词的结尾
^ 匹配字符串的开始
$ 匹配字符串的结尾
W
匹配非字母或数字或下划线
D
匹配非数字
S
匹配非空白符
a|b
匹配字符a或字符b
()
匹配括号内的表达式,也表示一个组
[...]
匹配字符组中的字符
[^...]
匹配除了字符组中字符的所有字符

 

量词:

量词
用法说明
* 重复零次或更多次
重复一次或更多次
? 重复零次或一次
{n} 重复n次
{n,} 重复n次或更多次
{n,m} 重复n到m次

 

  不以为奇成效:

. ^ $

正则 待匹配字符 匹配
结果
说明
海. 海燕海娇海东 海燕海娇海东   匹配所有"海."的字符
^海. 海燕海娇海东 海燕 只从开头匹配"海."
  海.$   海燕海娇海东 海东 只匹配结尾的"海.$"

 

图片 87图片 88

* ? { }

正则 待匹配字符 匹配
结果
说明
李.? 李杰和李莲英和李二棍子

李杰
李莲
李二

 
?表示重复零次或一次,即只匹配"李"后面一个任意字符
 
李.* 李杰和李莲英和李二棍子 李杰和李莲英和李二棍子
*表示重复零次或多次,即匹配"李"后面0或多个任意字符
李. 李杰和李莲英和李二棍子 李杰和李莲英和李二棍子
 表示重复一次或多次,即只匹配"李"后面1个或多个任意字符
李.{1,2} 李杰和李莲英和李二棍子

李杰和
李莲英
李二棍

{1,2}匹配1到2次任意字符

 注意:前面的*, ,?等都以贪心相称,也正是尽大概相称,前边加?号使其变为惰性相配

正则 待匹配字符 匹配
结果
说明
李.*? 李杰和李莲英和李二棍子

惰性匹配

 

 1 1
 2 2
 3 3
 4 4
 5 5
 6 6
 7 7
 8 8
 9 9
10 10
11 11
12 12
13 13
14 14
15 15
16 16
17 17
18 18
19 19
20 20
21 21
22 22
23 obj.length                           长度
24  
25 obj.trim()                           移除空白
26 obj.trimLeft()
27 obj.trimRight)
28 obj.charAt(n)                        返回字符串中的第n个字符
29 obj.concat(value, ...)               拼接
30 obj.indexOf(substring,start)         子序列位置
31 obj.lastIndexOf(substring,start)     子序列位置
32 obj.substring(from, to)              根据索引获取子序列
33 obj.slice(start, end)                切片
34 obj.toLowerCase()                    大写
35 obj.toUpperCase()                    小写
36 obj.split(delimiter, limit)          分割
37 obj.search(regexp)                   从头开始匹配,返回匹配成功的第一个位置(g无效)
38 obj.match(regexp)                    全局搜索,如果正则中有g表示找到全部,否则只找到第一个。
39 obj.replace(regexp, replacement)     替换,正则中有g则替换所有,否则只替换第一个匹配项,
40                                      $数字:匹配的第n个组内容;
41                                      $&:当前匹配的内容;
42                                      $`:位于匹配子串左侧的文本;
43                                      $':位于匹配子串右侧的文本
44                                      $$:直接量$符号

字符集[][^]

正则 待匹配字符 匹配
结果
说明
李[杰莲英二棍子]* 李杰和李莲英和李二棍子

李杰
李莲英
李二棍子

 
表示匹配"李"字后面[杰莲英二棍子]的字符任意次
 
李[^和]* 李杰和李莲英和李二棍子

李杰
李莲英
李二棍子

表示匹配一个不是"和"的字符任意次
[d] 456bdha3

4
5
6
3

表示匹配任意一个数字,匹配到4个结果
[d] 456bdha3

456
3

表示匹配任意个数字,匹配到2个结果

 

View Code

分组 ()与 或 |[^]

 居民身份证号码是八个尺寸为15或贰十一个字符的字符串,假如是14位则全部️数字组合,第二位不能够为0;假诺是贰十一位,则前二十人风流倜傥体是数字,倒数一位大概是数字或x,上面我们尝试用正则来代表:

正则 待匹配字符 匹配
结果
说明
^[1-9]d{13,16}[0-9x]$ 110101198001017032

110101198001017032

   表示可以匹配一个正确的身份证号
^[1-9]d{13,16}[0-9x]$ 1101011980010170

1101011980010170

表示也可以匹配这串数字,但这并不是一个正确的身份证号码,它是一个16位的数字
^[1-9]d{14}(d{2}[0-9x])?$ 1101011980010170

False

现在不会匹配错误的身份证号了
()表示分组,将d{2}[0-9x]分成一组,就可以整体约束他们出现的次数为0-1次
^([1-9]d{16}[0-9x]|[1-9]d{14})$ 110105199812067023

110105199812067023

表示先匹配[1-9]d{16}[0-9x]如果没有匹配上就匹配[1-9]d{14}

 

  3、布尔类型以致逻辑运算符

转义符

在正则表明式中,有不罕有独辟蹊径含义的是元字符,比方d和s等,假诺要在正则中匹配正常的"d"实际不是"数字"就需求对""举行转义,酿成'\'。

在python中,不论是正则表达式,依旧待相配的内容,都以以字符串的样式现身的,在字符串中也是有独出新裁的意思,本人还亟需转义。所以假如合营一回"d",字符串中要写成'\d',那么正则里就要写成"\\d",那样就太费力了。那时候我们就用到了r'd'那个定义,那时的正则是r'\d'就能够了。

正则 待匹配字符 匹配
结果
说明
d d  False
因为在正则表达式中是有特殊意义的字符,所以要匹配d本身,用表达式d无法匹配
\d d  True
转义之后变成\,即可匹配
"\\d" '\d'  True
如果在python中,字符串中的''也需要转义,所以每一个字符串''又需要转义一次
r'\d' r'd'  True
在字符串之前加r,让整个字符串不转义

 

  

贪婪相称

东食西宿匹配:在满足相称时,相称尽恐怕长的字符串,暗中同意情形下,接收贪婪匹配

正则 待匹配字符 匹配
结果
说明
<.*>

<script>...<script>

<script>...<script>
默认为贪婪匹配模式,会匹配尽量长的字符串
<.*?> r'd'  

<script>
<script>

加上?为将贪婪匹配模式转为非贪婪匹配模式,会匹配尽量短的字符串
几个常用的非贪婪匹配Pattern

*? 重复任意次,但尽可能少重复
 ? 重复1次或更多次,但尽可能少重复
?? 重复0次或1次,但尽可能少重复
{n,m}? 重复n到m次,但尽可能少重复
{n,}? 重复n次以上,但尽可能少重复

.*?的用法

图片 89

. 是任意字符
* 是取 0 至 无限长度
? 是非贪婪模式。
何在一起就是 取尽量少的任意字符,一般不会这么单独写,他大多用在:
.*?x

就是取前面任意长度的字符,直到一个x出现

图片 90

  布尔类型仅包括真假,与Python差别的是其首字母小写。

re模块下的常用方法

 

图片 91

import re

ret = re.findall('a', 'eva egon yuan')  # 返回所有满足匹配条件的结果,放在列表里
print(ret) #结果 : ['a', 'a']

ret = re.search('a', 'eva egon yuan').group()
print(ret) #结果 : 'a'
# 函数会在字符串内查找模式匹配,只到找到第一个匹配然后返回一个包含匹配信息的对象,该对象可以
# 通过调用group()方法得到匹配的字符串,如果字符串没有匹配,则返回None。

ret = re.match('a', 'abc').group()  # 同search,不过尽在字符串开始处进行匹配
print(ret)
#结果 : 'a'

ret = re.split('[ab]', 'abcd')  # 先按'a'分割得到''和'bcd',在对''和'bcd'分别按'b'分割
print(ret)  # ['', '', 'cd']

ret = re.sub('d', 'H', 'eva3egon4yuan4', 1)#将数字替换成'H',参数1表示只替换1个
print(ret) #evaHegon4yuan4

ret = re.subn('d', 'H', 'eva3egon4yuan4')#将数字替换成'H',返回元组(替换的结果,替换了多少次)
print(ret)

obj = re.compile('d{3}')  #将正则表达式编译成为一个 正则表达式对象,规则要匹配的是3个数字
ret = obj.search('abc123eeee') #正则表达式对象调用search,参数为待匹配的字符串
print(ret.group())  #结果 : 123

import re
ret = re.finditer('d', 'ds3sy4784a')   #finditer返回一个存放匹配结果的迭代器
print(ret)  # <callable_iterator object at 0x10195f940>
print(next(ret).group())  #查看第一个结果
print(next(ret).group())  #查看第二个结果
print([i.group() for i in ret])  #查看剩余的左右结果

图片 92

注意:

1 findall的优先级查询:

图片 93

import re

ret = re.findall('www.(baidu|oldboy).com', 'www.oldboy.com')
print(ret)  # ['oldboy']     这是因为findall会优先把匹配结果组里内容返回,如果想要匹配结果,取消权限即可

ret = re.findall('www.(?:baidu|oldboy).com', 'www.oldboy.com')
print(ret)  # ['www.oldboy.com']

图片 94

 

2 split的先行级查询

图片 95

ret=re.split("d ","eva3egon4yuan")
print(ret) #结果 : ['eva', 'egon', 'yuan']

ret=re.split("(d )","eva3egon4yuan")
print(ret) #结果 : ['eva', '3', 'egon', '4', 'yuan']

#在匹配部分加上()之后所切出的结果是不同的,
#没有()的没有保留所匹配的项,但是有()的却能够保留了匹配的项,
#这个在某些需要保留匹配部分的使用过程是非常重要的。

图片 96

 

 

  • ==      相比值特出
  • !=       不等于
  • ===   比较值和品种相等
  • !===  不等于
  • ||        或
  • &&      且

练习

  4、数组

1、相称标签

图片 97图片 98

图片 99

import re


ret = re.search("<(?P<tag_name>w )>w </(?P=tag_name)>","<h1>hello</h1>")
#还可以在分组中利用?<name>的形式给分组起名字
#获取的匹配结果可以直接用group('名字')拿到对应的值
print(ret.group('tag_name'))  #结果 :h1
print(ret.group())  #结果 :<h1>hello</h1>

ret = re.search(r"<(w )>w </1>","<h1>hello</h1>")
#如果不给组起名字,也可以用序号来找到对应的组,表示要找的内容和前面的组内容一致
#获取的匹配结果可以直接用group(序号)拿到对应的值
print(ret.group(1))
print(ret.group())  #结果 :<h1>hello</h1>

图片 100

View Code

 

  JavaScript中的数组相近于Python中的列表

2、相配整数

图片 101图片 102

图片 103

import re

ret=re.findall(r"d ","1-2*(60 (-40.35/5)-(-4*3))")
print(ret) #['1', '2', '60', '40', '35', '5', '4', '3']
ret=re.findall(r"-?d .d*|(-?d )","1-2*(60 (-40.35/5)-(-4*3))")
print(ret) #['1', '-2', '60', '', '5', '-4', '3']
ret.remove("")
print(ret) #['1', '-2', '60', '5', '-4', '3']

图片 104

View Code

 

  多如牛毛效率:

3、数字相配

图片 105图片 106

图片 107

1、 匹配一段文本中的每行的邮箱
      http://blog.csdn.net/make164492212/article/details/51656638

2、 匹配一段文本中的每行的时间字符串,比如:‘1990-07-12’;

   分别取出1年的12个月(^(0?[1-9]|1[0-2])$)、
   一个月的31天:^((0?[1-9])|((1|2)[0-9])|30|31)$

3、 匹配qq号。(腾讯QQ号从10000开始)  [1,9][0,9]{4,}

4、 匹配一个浮点数。       ^(-?d )(.d )?$   或者  -?d .?d*

5、 匹配汉字。             ^[u4e00-u9fa5]{0,}$ 

6、 匹配出所有整数

图片 108

View Code

 

图片 109图片 110

4、爬虫练习

图片 111图片 112

图片 113

import requests

import re
import json

def getPage(url):

    response=requests.get(url)
    return response.text

def parsePage(s):

    com=re.compile('<div class="item">.*?<div class="pic">.*?<em .*?>(?P<id>d ).*?(?P<title>.*?)'
                   '.*?(?P<rating_num>.*?).*?(?P<comment_num>.*?)评价',re.S)

    ret=com.finditer(s)
    for i in ret:
        yield {
            "id":i.group("id"),
            "title":i.group("title"),
            "rating_num":i.group("rating_num"),
            "comment_num":i.group("comment_num"),
        }

def main(num):

    url='https://movie.douban.com/top250?start=%s&filter='%num
    response_html=getPage(url)
    ret=parsePage(response_html)
    print(ret)
    f=open("move_info7","a",encoding="utf8")

    for obj in ret:
        print(obj)
        data=json.dumps(obj,ensure_ascii=False)
        f.write(data "n")

if __name__ == '__main__':
    count=0
    for i in range(10):
        main(count)
        count =25

图片 114

View Code

图片 115图片 116

图片 117

import re
import json
from urllib.request import urlopen

def getPage(url):
    response = urlopen(url)
    return response.read().decode('utf-8')

def parsePage(s):
    com = re.compile(
        '<div class="item">.*?<div class="pic">.*?<em .*?>(?P<id>d ).*?(?P<title>.*?)'
        '.*?(?P<rating_num>.*?).*?(?P<comment_num>.*?)评价', re.S)

    ret = com.finditer(s)
    for i in ret:
        yield {
            "id": i.group("id"),
            "title": i.group("title"),
            "rating_num": i.group("rating_num"),
            "comment_num": i.group("comment_num"),
        }


def main(num):
    url = 'https://movie.douban.com/top250?start=%s&filter=' % num
    response_html = getPage(url)
    ret = parsePage(response_html)
    print(ret)
    f = open("move_info7", "a", encoding="utf8")

    for obj in ret:
        print(obj)
        data = str(obj)
        f.write(data   "n")

count = 0
for i in range(10):
    main(count)
    count  = 25

图片 118

简化版

图片 119图片 120

图片 121

flags有很多可选值:

re.I(IGNORECASE)忽略大小写,括号内是完整的写法
re.M(MULTILINE)多行模式,改变^和$的行为
re.S(DOTALL)点可以匹配任意字符,包括换行符
re.L(LOCALE)做本地化识别的匹配,表示特殊字符集 w, W, b, B, s, S 依赖于当前环境,不推荐使用
re.U(UNICODE) 使用w W s S d D使用取决于unicode定义的字符属性。在python3中默认使用该flag
re.X(VERBOSE)冗长模式,该模式下pattern字符串可以是多行的,忽略空白字符,并可以添加注释

图片 122

flags

 

 1 obj.length          数组的大小
 2  
 3 obj.push(ele)       尾部追加元素
 4 obj.pop()           尾部获取一个元素
 5 obj.unshift(ele)    头部插入元素
 6 obj.shift()         头部移除元素
 7 obj.splice(start, deleteCount, value, ...)  插入、删除或替换数组的元素
 8                     obj.splice(n,0,val) 指定位置插入元素
 9                     obj.splice(n,1,val) 指定位置替换元素
10                     obj.splice(n,1)     指定位置删除元素
11 obj.slice( )        切片
12 obj.reverse( )      反转
13 obj.join(sep)       将数组元素连接起来以构建一个字符串
14 obj.concat(val,..)  连接数组
15 obj.sort( )         对数组元素进行排序

作业

实现能计算类似 
1 - 2 * ( (60-30  (-40/5) * (9-2*5/3   7 /3*99/4*2998  10 * 568/14 )) - (-4*3)/ (16-3*2) )等类似公式的计算器程序

 

在线测验工具 

View Code

 四、语句和那么些

  1、条件语句

  js中接济三种口径语句,if和switch

图片 123图片 124

1    if(条件){
2  
3     }else if(条件){
4          
5     }else{
6  
7     }

if

图片 125图片 126

1    switch(name){
2         case '1':
3             age = 123;
4             break;
5         case '2':
6             age = 456;
7             break;
8         default :
9             age = 777;

switch

  2,三种循环语句

图片 127图片 128

1 var names = ["alex", "tony", "rain"];
2  
3 for(var i=0;i<names.length;i  ){
4     console.log(i);
5     console.log(names[i]);
6 }

for

图片 129图片 130

1 var names = ["alex", "tony", "rain"];
2 
3 for(var index in names){
4     console.log(index);
5     console.log(names[index]);
6 }

for

图片 131图片 132

1 while(条件){
2     // break;
3     // continue;
4 }

while

  3、万分管理

图片 133图片 134

 1 try {
 2     //这段代码从上往下运行,其中任何一个语句抛出异常该代码块就结束运行
 3 }
 4 catch (e) {
 5     // 如果try代码块中抛出了异常,catch代码块中的代码就会被执行。
 6     //e是一个局部变量,用来指向Error对象或者其他抛出的对象
 7 }
 8 finally {
 9      //无论try中代码是否有异常抛出(甚至是try代码块中有return语句),finally代码块中始终会被执行。
10 }
11 注:主动跑出异常 throw Error('xxxx')

View Code

五、函数

  1、基本函数的选取相仿可以分成以下三类

// 普通函数
    function func(arg){
        return true;
    }

// 匿名函数
    var func = function(arg){
        return "tony";
    }

// 自执行函数
    (function(arg){
        console.log(arg);
    })('123')
注意:对于JavaScript中函数参数,实际参数的个数可能小于形式参数的个数,函数内的特殊值arguments中封装了所有实际参数。

  2、作用域

  

  JavaScript中各样函数都有协和的功能域,当现身函数嵌套时,就现身了职能域链。当内层函数使用变量时,会依靠效果与利益域链从内到外风华正茂稀缺的循环,即使官样文章,则不行。

  切记:全部的功用域在开立函数且未施行时候就已经存在。

图片 135图片 136

 1 function f2(){
 2     var arg= 111;
 3     function f3(){
 4         console.log(arg);
 5     }
 6      
 7     return f3;
 8 }
 9  
10 ret = f2();
11 ret();

View Code

  注:注明提前,在JavaScript引擎“预编写翻译”时开展js是以函数为功用域的。

  3、闭包

  

  「闭包」,是指具有多少个变量和绑定了这几个变量的情状的表明式(平常是二个函数卡塔尔,因此那几个变量也是该表明式的风姿罗曼蒂克有的。

  闭包是个函数,而它「记住了四周发出了什么样」。表现为由「三个函数」体中定义了「另个函数」

  由于效果域链只可以从内向外找,暗中认可外界不能够赢得函数内部变量。闭包,在表面得到函数内部的变量。

图片 137图片 138

 1 function f2(){
 2     var arg= [11,22];
 3     function f3(){
 4         return arg;
 5     }
 6     return f3;
 7 }
 8  
 9 ret = f2();
10 ret();

View Code

  4、面向对象

  

图片 139图片 140

 1 function Foo (name,age) {
 2     this.Name = name;
 3     this.Age = age;
 4     this.Func = function(arg){
 5         return this.Name   arg;
 6     }
 7 }
 8   
 9 var obj = new Foo('alex', 18);
10 var ret = obj.Func("sb");
11 console.log(ret);

View Code

  

  对于上述代码须求专心:

  • Foo当做的构造函数
  • this代指对象
  • 创立对象时索要接受 new

  上述代码中各种对象中均保存了叁个等同的Func函数,进而浪费内部存款和储蓄器。使用原型和能够化解该难点:

  

function Foo (name,age) {
    this.Name = name;
    this.Age = age;
}
Foo.prototype = {
    GetInfo: function(){
        return this.Name   this.Age
    },
    Func : function(arg){
        return this.Name   arg;
    }
}

六、其他

  1、序列化

  • JSON.stringify(obj)   序列化
  • JSON.parse(str)        反体系化

  2、转义

  

  • decodeU库罗德I( )                   UOdysseyl中未转义的字符
  • decodeULANDIComponent( )   UEvoqueI组件中的未转义字符
  • encodeU哈弗I( )                   U猎豹CS6I中的转义字符
  • encodeU索罗德IComponent( )   转义UOdysseyI组件中的字符
  • escape( )                         对字符串转义
  • unescape( )                     给转义字符串解码
  • U奥迪Q5IError                         由U帕杰罗l的编码和解码方法抛出

  3、eval

  

  JavaScript中的eval是Python中eval和exec的合集,不仅可以够编写翻译代码也能够拿走重返值。

  • eval() 
  • EvalError   推行字符串中的JavaScript代码

  4、正则表明式

  

  1、定义正则表达式

  • /.../  用于定义正则表明式
  • /.../g 表示全局相配
  • /.../i 代表不区分抑扬顿挫写
  • /.../m 表示多行相配
    JS正则相配时本身便是支撑多行,此处多行相称只是震慑正则表达式^和$,m格局也会接纳^$来同盟换行的内容)

图片 141图片 142

1 var pattern = /^Javaw*/gm;
2 var text = "JavaScript is more fun than nJavaEE or JavaBeans!";
3 result = pattern.exec(text)
4 result = pattern.exec(text)
5 result = pattern.exec(text)

View Code

  注:定义正则表达式也能够  reg= new RegExp()

  2、匹配

  JavaScript中协助正则表达式,其重大提供了七个效果与利益:

  • test(string)     检查字符串中是或不是和正则相称

图片 143图片 144

1 n = 'uui99sdf'
2 reg = /d /
3 reg.test(n)  ---> true
4  
5 # 只要正则在字符串中存在就匹配,如果想要开头和结尾匹配的话,就需要在正则前后加 ^和$

View Code

  exec(string)    获取正则表明式相配的原委,借使未相配,值为null,不然,获取相配成功的数组。

图片 145图片 146

 1 获取正则表达式匹配的内容,如果未匹配,值为null,否则,获取匹配成功的数组。
 2  
 3 非全局模式
 4     获取匹配结果数组,注意:第一个元素是第一个匹配的结果,后面元素是正则子匹配(正则内容分组匹配)
 5     var pattern = /bJavaw*b/;
 6     var text = "JavaScript is more fun than Java or JavaBeans!";
 7     result = pattern.exec(text)
 8  
 9     var pattern = /b(Java)w*b/;
10     var text = "JavaScript is more fun than Java or JavaBeans!";
11     result = pattern.exec(text)
12  
13 全局模式
14     需要反复调用exec方法,来一个一个获取结果,直到匹配获取结果为null表示获取完毕
15     var pattern = /bJavaw*b/g;
16     var text = "JavaScript is more fun than Java or JavaBeans!";
17     result = pattern.exec(text)
18  
19     var pattern = /b(Java)w*b/g;
20     var text = "JavaScript is more fun than Java or JavaBeans!";
21     result = pattern.exec(text)

View Code

  3、字符串相关方法

图片 147图片 148

1 obj.search(regexp)                   获取索引位置,搜索整个字符串,返回匹配成功的第一个位置(g模式无效)
2 obj.match(regexp)                    获取匹配内容,搜索整个字符串,获取找到第一个匹配内容,如果正则是g模式找到全部
3 obj.replace(regexp, replacement)     替换匹配替换,正则中有g则替换所有,否则只替换第一个匹配项,
4                                         $数字:匹配的第n个组内容;
5                                           $&:当前匹配的内容;
6                                           $`:位于匹配子串左侧的文本;
7                                           $':位于匹配子串右侧的文本
8                                           $$:直接量$符号
9   

View Code

  5,、时间拍卖

  JavaScript中提供了时光相关的操作,时间操作中分为三种时光:

  • 时刻统不平日间
  • 地方时间(东8区卡塔 尔(英语:State of Qatar)

*  越来越多操作参见:

 

本文由pc28.am发布于计算机编程,转载请注明出处:re模块和正则表达式,正则表达式应用

上一篇:记录程序耗时的方法,记录程序耗时方法 下一篇:没有了
猜你喜欢
热门排行
精彩图文