范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

Python爬虫入门六之正则表达式

  在前面我们已经搞定了怎样获取页面的内容,不过还差一步,这么多杂乱的代码夹杂文字我们怎样把它提取出来整理呢?下面就开始介绍一个十分强大的工具,正则表达式! 1. 了解正则表达式
  正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个 "规则字符串",这个 "规则字符串" 用来表达对字符串的一种过滤逻辑。
  正则表达式是用来匹配字符串非常强大的工具,在其他编程语言中同样有正则表达式的概念,Python 同样不例外,利用了正则表达式,我们想要从返回的页面内容提取出我们想要的内容就易如反掌了。
  正则表达式的大致匹配过程是: 1. 依次拿出表达式和文本中的字符比较, 2. 如果每一个字符都能匹配,则匹配成功;一旦有匹配不成功的字符则匹配失败。 3. 如果表达式中有量词或边界,这个过程会稍微有一些不同。2. 正则表达式的语法规则
  下面是 Python 中正则表达式的一些匹配规则,图片资料来自 CSDN
  3. 正则表达式相关注解(1)数量词的贪婪模式与非贪婪模式
  正则表达式通常用于在文本中查找匹配的字符串。Python 里数量词默认是贪婪的(在少数语言里也可能是默认非贪婪),总是尝试匹配尽可能多的字符;非贪婪的则相反,总是尝试匹配尽可能少的字符。例如:正则表达式"ab "如果用于查找" abbbc",将找到"abbb"。而如果使用非贪婪的数量词"ab ?",将找到"a"。 注:我们一般使用非贪婪模式来提取。 (2)反斜杠问题
  与大多数编程语言相同,正则表达式里使用""作为转义字符,这就可能造成反斜杠困扰。假如你需要匹配文本中的字符"",那么使用编程语言表示的正则表达式里将需要 4 个反斜杠"\":前两个和后两个分别用于在编程语言里转义成反斜杠,转换成两个反斜杠后再在正则表达式里转义成一个反斜杠。 Python 里的原生字符串很好地解决了这个问题,这个例子中的正则表达式可以使用 r""表示。同样,匹配一个数字的"d" 可以写成 r"d"。有了原生字符串,妈妈也不用担心是不是漏写了反斜杠,写出来的表达式也更直观勒。 4.Python Re 模块
  Python 自带了 re 模块,它提供了对正则表达式的支持。主要用到的方法列举如下 #返回pattern对象 re.compile(string[,flag])   #以下为匹配所用函数 re.match(pattern, string[, flags]) re.search(pattern, string[, flags]) re.split(pattern, string[, maxsplit]) re.findall(pattern, string[, flags]) re.finditer(pattern, string[, flags]) re.sub(pattern, repl, string[, count]) re.subn(pattern, repl, string[, count])
  在介绍这几个方法之前,我们先来介绍一下 pattern 的概念,pattern 可以理解为一个匹配模式,那么我们怎么获得这个匹配模式呢?很简单,我们需要利用 re.compile 方法就可以。例如 pattern = re.compile(r"hello")
  在参数中我们传入了原生字符串对象,通过 compile 方法编译生成一个 pattern 对象,然后我们利用这个对象来进行进一步的匹配。 另外大家可能注意到了另一个参数 flags,在这里解释一下这个参数的含义: 参数 flag 是匹配模式,取值可以使用按位或运算符’|’表示同时生效,比如 re.I | re.M。 可选值有: • re.I(全拼:IGNORECASE): 忽略大小写(括号内是完整写法,下同) • re.M(全拼:MULTILINE): 多行模式,改变"^"和"#39;的行为(参见上图) • re.S(全拼:DOTALL): 点任意匹配模式,改变"."的行为 • re.L(全拼:LOCALE): 使预定字符类 w W b B s S 取决于当前区域设定 • re.U(全拼:UNICODE): 使预定字符类 w W b B s S d D 取决于unicode定义的字符属性 • re.X(全拼:VERBOSE): 详细模式。这个模式下正则表达式可以是多行,忽略空白字符,并可以加入注释。
  在刚才所说的另外几个方法例如 re.match 里我们就需要用到这个 pattern 了,下面我们一一介绍。
  注:以下七个方法中的 flags 同样是代表匹配模式的意思,如果在 pattern 生成时已经指明了 flags,那么在下面的方法中就不需要传入这个参数了。(1)re.match(pattern, string[, flags])
  这个方法将会从 string(我们要匹配的字符串)的开头开始,尝试匹配 pattern,一直向后匹配,如果遇到无法匹配的字符,立即返回 None,如果匹配未结束已经到达 string 的末尾,也会返回 None。两个结果均表示匹配失败,否则匹配 pattern 成功,同时匹配终止,不再对 string 向后匹配。下面我们通过一个例子理解一下 __author__ = "CQC" # -*- coding: utf-8 -*-  #导入re模块 import re  # 将正则表达式编译成Pattern对象,注意hello前面的r的意思是"原生字符串" pattern = re.compile(r"hello")  # 使用re.match匹配文本,获得匹配结果,无法匹配时将返回None result1 = re.match(pattern,"hello") result2 = re.match(pattern,"helloo CQC!") result3 = re.match(pattern,"helo CQC!") result4 = re.match(pattern,"hello CQC!")  #如果1匹配成功 if result1:     # 使用Match获得分组信息     print result1.group() else:     print "1匹配失败!"   #如果2匹配成功 if result2:     # 使用Match获得分组信息     print result2.group() else:     print "2匹配失败!"   #如果3匹配成功 if result3:     # 使用Match获得分组信息     print result3.group() else:     print "3匹配失败!"  #如果4匹配成功 if result4:     # 使用Match获得分组信息     print result4.group() else:     print "4匹配失败!"
  运行结果 hello hello 3匹配失败! hello
  匹配分析 1. 第一个匹配,pattern 正则表达式为’hello’,我们匹配的目标字符串 string 也为 hello,从头至尾完全匹配,匹配成功。 2. 第二个匹配,string 为 helloo CQC,从 string 头开始匹配 pattern 完全可以匹配,pattern 匹配结束,同时匹配终止,后面的 o CQC 不再匹配,返回匹配成功的信息。 3. 第三个匹配,string 为 helo CQC,从 string 头开始匹配 pattern,发现到 ‘o’ 时无法完成匹配,匹配终止,返回 None 4. 第四个匹配,同第二个匹配原理,即使遇到了空格符也不会受影响。 我们还看到最后打印出了 result.group (),这个是什么意思呢?下面我们说一下关于 match 对象的的属性和方法 Match 对象是一次匹配的结果,包含了很多关于此次匹配的信息,可以使用 Match 提供的可读属性或方法来获取这些信息。
  属性: 1.string: 匹配时使用的文本。 2.re: 匹配时使用的 Pattern 对象。 3.pos: 文本中正则表达式开始搜索的索引。值与 Pattern.match () 和 Pattern.seach () 方法的同名参数相同。 4.endpos: 文本中正则表达式结束搜索的索引。值与 Pattern.match () 和 Pattern.seach () 方法的同名参数相同。 5.lastindex: 最后一个被捕获的分组在文本中的索引。如果没有被捕获的分组,将为 None。 6.lastgroup: 最后一个被捕获的分组的别名。如果这个分组没有别名或者没有被捕获的分组,将为 None。 方法: 1.group ([group1, …]): 获得一个或多个分组截获的字符串;指定多个参数时将以元组形式返回。group1 可以使用编号也可以使用别名;编号 0 代表整个匹配的子串;不填写参数时,返回 group (0);没有截获字符串的组返回 None;截获了多次的组返回最后一次截获的子串。 2.groups ([default]): 以元组形式返回全部分组截获的字符串。相当于调用 group (1,2,…last)。default 表示没有截获字符串的组以这个值替代,默认为 None。 3.groupdict ([default]): 返回以有别名的组的别名为键、以该组截获的子串为值的字典,没有别名的组不包含在内。default 含义同上。 4.start ([group]): 返回指定的组截获的子串在 string 中的起始索引(子串第一个字符的索引)。group 默认值为 0。 5.end ([group]): 返回指定的组截获的子串在 string 中的结束索引(子串最后一个字符的索引 + 1)。group 默认值为 0。 6.span ([group]): 返回 (start (group), end (group))。 7.expand (template): 将匹配到的分组代入 template 中然后返回。template 中可以使用 id 或 g、g 引用分组,但不能使用编号 0。id 与 g 是等价的;但 10 将被认为是第 10 个分组,如果你想表达 1 之后是字符’0’,只能使用 g0。
  下面我们用一个例子来体会一下 # -*- coding: utf-8 -*- #一个简单的match实例  import re # 匹配如下内容:单词+空格+单词+任意字符 m = re.match(r"(w+) (w+)(?P.*)", "hello world!")  print "m.string:", m.string print "m.re:", m.re print "m.pos:", m.pos print "m.endpos:", m.endpos print "m.lastindex:", m.lastindex print "m.lastgroup:", m.lastgroup print "m.group():", m.group() print "m.group(1,2):", m.group(1, 2) print "m.groups():", m.groups() print "m.groupdict():", m.groupdict() print "m.start(2):", m.start(2) print "m.end(2):", m.end(2) print "m.span(2):", m.span(2) print r"m.expand(r"g gg"):", m.expand(r"2 13")   ### output ### # m.string: hello world! # m.re:  # m.pos: 0 # m.endpos: 12 # m.lastindex: 3 # m.lastgroup: sign # m.group(1,2): ("hello", "world") # m.groups(): ("hello", "world", "!") # m.groupdict(): {"sign": "!"} # m.start(2): 6 # m.end(2): 11 # m.span(2): (6, 11) # m.expand(r"2 13"): world hello!(2)re.search(pattern, string[, flags])
  search 方法与 match 方法极其类似,区别在于 match () 函数只检测 re 是不是在 string 的开始位置匹配,search () 会扫描整个 string 查找匹配,match()只有在 0 位置匹配成功的话才有返回,如果不是开始位置匹配成功的话,match () 就返回 None。同样,search 方法的返回对象同样 match () 返回对象的方法和属性。我们用一个例子感受一下 #导入re模块 import re  # 将正则表达式编译成Pattern对象 pattern = re.compile(r"world") # 使用search()查找匹配的子串,不存在能匹配的子串时将返回None # 这个例子中使用match()无法成功匹配 match = re.search(pattern,"hello world!") if match:     # 使用Match获得分组信息     print match.group() ### 输出 ### # world(3)re.split(pattern, string[, maxsplit])
  按照能够匹配的子串将 string 分割后返回列表。maxsplit 用于指定最大分割次数,不指定将全部分割。我们通过下面的例子感受一下。 import re  pattern = re.compile(r"d+") print re.split(pattern,"one1two2three3four4")  ### 输出 ### # ["one", "two", "three", "four", ""](4)re.findall(pattern, string[, flags])
  搜索 string,以列表形式返回全部能匹配的子串。我们通过这个例子来感受一下 import re  pattern = re.compile(r"d+") print re.findall(pattern,"one1two2three3four4")  ### 输出 ### # ["1", "2", "3", "4"](5)re.finditer(pattern, string[, flags])
  搜索 string,返回一个顺序访问每一个匹配结果(Match 对象)的迭代器。我们通过下面的例子来感受一下 import re  pattern = re.compile(r"d+") for m in re.finditer(pattern,"one1two2three3four4"):     print m.group(),  ### 输出 ### # 1 2 3 4(6)re.sub(pattern, repl, string[, count])
  使用 repl 替换 string 中每一个匹配的子串后返回替换后的字符串。 当 repl 是一个字符串时,可以使用 id 或 g、g 引用分组,但不能使用编号 0。 当 repl 是一个方法时,这个方法应当只接受一个参数(Match 对象),并返回一个字符串用于替换(返回的字符串中不能再引用分组)。 count 用于指定最多替换次数,不指定时全部替换。 import re  pattern = re.compile(r"(w+) (w+)") s = "i say, hello world!"  print re.sub(pattern,r"2 1", s)  def func(m):     return m.group(1).title() + " " + m.group(2).title()  print re.sub(pattern,func, s)  ### output ### # say i, world hello! # I Say, Hello World!(7)re.subn(pattern, repl, string[, count])
  返回 (sub (repl, string [, count]), 替换次数)。 import re   pattern = re.compile(r"(w+) (w+)") s = "i say, hello world!"   print re.subn(pattern,r"2 1", s)   def func(m):     return m.group(1).title() + " " + m.group(2).title()   print re.subn(pattern,func, s)   ### output ### # ("say i, world hello!", 2) # ("I Say, Hello World!", 2)5.Python Re 模块的另一种使用方式
  在上面我们介绍了 7 个工具方法,例如 match,search 等等,不过调用方式都是 re.match,re.search 的方式,其实还有另外一种调用方式,可以通过 pattern.match,pattern.search 调用,这样调用便不用将 pattern 作为第一个参数传入了,大家想怎样调用皆可。 函数 API 列表 match(string[, pos[, endpos]]) | re.match(pattern, string[, flags]) search(string[, pos[, endpos]]) | re.search(pattern, string[, flags]) split(string[, maxsplit]) | re.split(pattern, string[, maxsplit]) findall(string[, pos[, endpos]]) | re.findall(pattern, string[, flags]) finditer(string[, pos[, endpos]]) | re.finditer(pattern, string[, flags]) sub(repl, string[, count]) | re.sub(pattern, repl, string[, count]) subn(repl, string[, count]) |re.sub(pattern, repl, string[, count])
  具体的调用方法不必详说了,原理都类似,只是参数的变化不同。小伙伴们尝试一下吧~小伙伴们加油哦!

手机夜景照片,敢不敢PK一下?回答了!现在由于手机拍摄功能越来越强大,拍摄夜景的功能日趋完善,在拍摄夜景时,可以选用的功能也比较多,比如,夜景模式,专业模式都可以进行夜间模式拍摄,拍出的效果也是比较理想的,特别最近一些直播卖货明星为何送礼送苹果手机,而不是华为手机呢?前不久,陈赫直播间送苹果手机,被很多人骂上了热搜。很多人也会疑惑为啥明星们都不送华为手机呢?不是牛娃认为,主要原因有三个苹果手机还是硬通货作为手机生产史上的颠覆者,苹果在乔布斯的领为什么那么多人反对玩手机?你好,我是丁大叔,很高兴回答你的问题。对于为什么那么多人反对玩手机这个问题,我认为,主要有以下几个方面的原因第一,手机是一种集通讯社会交往社会生活等功能于一体的工具,如果把手机仅仅买红米的手机的人收入普遍都不高吗?不一定,我现在用着红米Note51399我也有10000苹果macbook还有10000相机车房也都有!可是那些用着七八千块手机的人也可能只有一部手机而已!只是想说明其实很多人对手苹果新品成日更,一天发一个眼花缭乱3月20日晚,苹果发布第二代AirPods无线耳机,同时推出无线充电盒。AirPods第一代产品就颇受好评,作为目前旗下口碑最好的产品之一,新版还是做了一定的升级的。新款的AirP苹果官网悄然更新或揭示新款iPhoneSE即将到来?手机中国新闻近几天,苹果官网的一连串动作着实给力,每晚都有无数人守在电脑手机前,翘首以盼新品的到来。无论是iMaciPadminiiPadAir还是昨日发布的全新一代AirPods小米手环4曝光,支持蓝牙5。0,稳定性大幅提升如今智能穿戴设备可谓是发展迅速,好几年前都还只是在电影里出现的场景,现在却能真的实现在手表上打电话上网。而对于那些预算不太够但是又想体验智能穿戴设备的人来说,智能手环是一个不错的选小米又曝性价比之王新机,这次有什么新亮点?我们如果有心对比前两年的小米,会发现它已经奋力追逐市场前列的对手们了,虽然大家都知道小米是主打性价比的手机品牌,但是这几年确实它的手机业务普普通通,没有生产很多吸引人眼球的新机,而美媒现在谈禁用华为或太晚美中5G之战中国正在领先美媒称,美国和中国在欧洲开启5G之战,从欧洲对华为的使用程度来看,中国具有很多优势,正在领先。欧洲或是美中5G之战的主战场媒体3月20日报道,美国在敦促其世界各地的盟友出于网络安全三星再被逼宫,EMEA市场华为暴涨70份额大幅逼近,小米进前五作者虎龙吟虽然三星在2018年保住了其在全球智能手机出货量第一的宝座,但在越来越多的市场,华为正在向三星发起猛攻。可以预见,2019年,将成为三星与华为全球智能手机老大争夺战的分水6个点赞超高的资源网站让你10T资源爆满,告别资源匮乏!今天给大家分享6个资源网站,在这茫茫的网络中找资源,总是想要的资源找不到,没用的资源一大堆,偌大的百度资源严重告急。其实你也可以成为资源小达人,拥有这6款资源网站,让你10T资源爆
爱因斯坦曾说上帝不会掷骰子,但是量子力学让我们不得不相信有一只猫,曾经引发科学界的巨大关注,这只不死不活的猫像噩梦一样缠得物理学家不的安宁,同样也困扰着20世界最伟大的物理学家爱因斯坦,通过研究这只猫,伟大的物理学家爱因斯坦曾说过这么一知乎通过港交所聆讯营收结构多元化,但仍无法止亏新京报贝壳财经讯(记者白金蕾)4月8日,在线问答社区知乎在港交所上传了聆讯后资料集,这表示知乎已经通过香港交易所聆讯,原则上获得了在港交所主板上市的批准。毛利持续增加营收结构多元,司马南一账号的文章视频被禁,本人发文回应4月8日对于司马南来说,可谓是糟心的一天,自己的某众账号司马南频道被认为是违反了平台的的运营规范,发布的视频和文章被禁止分享。在他的主账号司马南的介绍里面,也标注了这样一句话司马南SQL简介及其分类一。简介SQL(StructuredQueryLanguage,结构化查询语言,简称SQL)是用于访问和处理数据库的标准的计算机语言。一门操作关系型数据库的编程语言,定义操作所有关杨元庆正式宣布,联想5年投入1000亿元,都误会杨元庆了?联想集团作为国产老牌企业,从1996年开始它的电脑销量就一直居于中国国内市场榜首。在2013年,联想的电脑销量一跃成为世界第一,在2016年全国工商联发布2016中国民营企业500快自查!这16款违法APP赶紧卸载国家计算机病毒应急处理中心监测发现16款违法移动应用国家计算机病毒应急处理中心近期通过互联网监测发现16款移动App存在隐私不合规行为,违反网络安全法个人信息保护法相关规定,涉嫌超以太坊网络当前已销毁209。31万枚ETHNFTSH拾荒最新获悉,据Ultrasound数据显示,截止目前,以太坊网络总共销毁2,093,072。85枚ETH。其中,OpenSea销毁230,046。28枚ETH,ETHt是谁让我们在网络中裸奔?智能大数据又是个啥?大数据我想朋友们并不陌生,什么是大数据?大数据又是干啥用的?喜欢数据方面的朋友加个关注,让我们一起来了解一下。大数据只是一个概念词,是科技时代的一个合成产物,用途也比较广泛,是一系微软开源基于golang开发的网络性能压测工具ethr实践概述Ethr是一个用golang编写的跨平台网络性能测量工具。该项目的目标是提供一个本地工具,用于跨TCPUDPHTTPHTTPS等多种协议以及跨多个平台的带宽连接秒数据包秒延迟丢工业4。0时代,我们应该是跟随前进还是先把基础做好再去追随潮流工业4。0在世界掀起一阵阵浪潮,这种浪潮被认为是一种颠覆性的技术革命,将彻底改变世界。工业4。0大数据云人工智能等高新科技将改变世界,制造业也纷纷导入工业4。0,以盼实现制造核心技亚马逊称将推翻纽约仓库成立工会投票结果据报道,上周亚马逊纽约斯塔滕的一座物流仓库投票诞生了亚马逊首个工会。但据亚马逊向美国国家劳工关系委员会(NLRB)提交的最后期限延长请求,其计划推翻这一投票结果。亚马逊方面指控工会