专栏:003:正则表达式

系列爬虫专栏

崇尚的学习思维是:输入,输出平衡,且维持平衡点不断精进的地步

曾经有大神告诫说:没事别瞎写文章;为此写的都是,在我能力范围内的

1:框架

序号 章节 解释
01 概念解释 概念是理解和精进的第一步
02 语法解释 2/8法则,解释使用最频繁的语法
03 代码实例 对博客内容进行使用正则表达式匹配
04 参考及说明 参考列表

2:概念

  • 什么是正则表达式?

正则表达式,又称正规表示式、正规表示法、正规表达式、规则表达式、常规表示法(英语:Regular Expression,在代码中常简写为regex、regexp或RE),计算机科学的一个概念。正则表达式使用单个字符串来描述、匹配一系列匹配某个句法规则的字符串。

用自己的话复述:正则表达式是一种匹配文本的工具,由字符串和特殊字符组成。相当于一种过滤器,不符合要求的被过滤掉。

  • 眼见为实

\bhi\b.*\bLucy\b这是个正则表达式

3:语法

记号 说明 示例
literal 匹配字符串的值 wuxiaoshen
. 匹配任意字符(除换行符之外) wu.iaoshen
^ 匹配字符串的开始 ^wuxiaoshen
$ 匹配字符串的结尾 wuxiaoshen$
* 匹配前面出现0次或者多次的 wu*xiaoshen
+ 匹配前面出现1次或者多次 wu+xiaoshen
? 匹配前面出现零次或者1次 wu?xiaoshen
{N} 匹配前面出现的正则表达式N次 [0-9]{2}
{M,N} 匹配前面出现的正则表达式M到N次之间 [0-9]{3,8}
[ ] 匹配里面内容的任意一个字符 wu[xyz]iaoshen
[x-y] 匹配任意之间的一个值 [0-9]
[^..] 不匹配里面内容任意值 [^0-9]
() 匹配封闭括号中正则表达式,并保存为子组 (wuxiaoshen)
特殊字符 特殊字符 特殊字符
\d 匹配数字 data\d.txt
\w 匹配任何数字字母字符 [wuxiao]\w+
\s 匹配空白符 of\sthe
\b 匹配单词的边界 \bwuxiaoshen\b
\D 不匹配数字
\W 不匹配数字字母字符
\S 匹配任意不是空白符的字符
\B 匹配不是单词开头或结束的位置

看不懂,那算了。

通杀型组合:(.*?)
括号里是你想要的内容,那就使用这个,后面会代码演示。

正则里有个贪婪还是非贪婪的概念:白话点说,贪婪就是匹配的尽可能长,非贪婪就是匹配符合要求的最短的。

  • 眼见为实
pattern = "http://mindhacks.cn/"

mind_pattern_1 = "mind"
mind_pattern_2 = "[m].*?d"
mind_pattern_3 = r"//(.*?)h"
mind_pattern_4 = r"[mind]{4}"

还可以想出各种,都是上面的基本语法的组合

上面是已知匹配信息,想出匹配规则,匹配出规定字符
  • 实例:

主观题:
匹配QQ号码:

匹配出手机号码:

匹配出IP:


QQnumber_pattern = '[1-9][0-9]{4,}'

tellnumber_pattern = '0?(13[0-9]|15[012356789]|17[0678]|18[0-9]|14[57])[0-9]{8}'

IPnumber_pattern = '((?:(?:25[0-5]|2[0-4]\d|((1\d{2})|([1-9]?\d))).){3}(?:25[0-5]|2[0-4]\d|((1\d{2})|([1-9]?\d))))'

IPnumber_pattern_2 = '\d+\.\d+\.\d+\.\d+'

个人理解,能匹配出绝大数,但可能还不够完美.

4:代码实例

先介绍个python模块:re

模块函数 描述
match(pattern, string, flag) 匹配以pattern开始的字符串
search(pattern, string, flag) 匹配第一符合要求的字符串,其他还符合,不管
findall(pattern, string, flag) 匹配全部符合要求的字符串
split(pattern, string, flag) 按格式进行切分
sub(pattern, repl, string, flag) 替换掉符合要求的字符串,常用来替换网址的组成
# 假设你对下面这个博客首页的文章的标题感兴趣.
import re
import requests
# 先缩小范围,再在缩小的范围内进行匹配

url_one = "http://www.geekonomics10000.com/author/admin"
html = requests.get(url_one)
response = html.text
#<h3 id="post-967" class="post-title"><a href="http://www.geekonomics10000.com/967" rel="bookmark" title="Permanent Link to 特朗普是极右狂人?其实共和党候选人里,他最温和">特朗普是极右狂人?其实共和党候选人里,他最温和</a></h3>

content = r'h3\sid(.*?)</h3>'

#title="Permanent Link to 特朗普是极右狂人?其实共和党候选人里,他最温和">特朗普是极右狂人?其实共和党候选人里,他最温和</a></h3>

little_title = r'title=.*?>(.*?)</a>'
all_title = re.findall(content, response, re.S)
title_content = re.findall(little_title, str(all_title), re.S)
for one in title_content:
    print(one)
# output
---
别指望灵感,还是要靠汗水 ——“创造性思维”的三个迷信
特朗普是极右狂人?其实共和党候选人里,他最温和
超强记忆力是个邪道功夫
我的新书《智识分子:做个复杂的现代人》
2016新年荐书
美国人说的圣贤之道
---

查看网页源代码:推荐chrome浏览器

# 假设你想匹配首页的课程图片
# -*- coding:utf-8 -*-
# To: regular expression
# Author: wuxiaoshen

import re
import requests
class TestRe(object):
    """
    使用正则表达式抓取imooc课首页网站的图片:并下载至002 JPG文件夹下
    """
    def __init__(self):

        pass

    def download(self):
        url = "http://www.imooc.com/course/list"
        html = requests.get(url)
        response = html.text
        listurl = re.findall(r'http://.+.jpg',response)
        print(listurl)
        i = 0
        for one in listurl:
            with open("002 JPG\\"+str(i)+".jpg","wb") as f:
                cont = requests.get(one)
                print(cont)
                f.write(cont.content)
                i += 1
            f.close()
        pass

if __name__=="__main__":
    download = TestRe()
    download.download()
    pass

4:参考及备注

参考资料:正则表达式

如何练习正则表达式:

  1. Notepad++ 文本编辑器 的查找可以使用正则匹配
1461750504276.png
  1. 还有在线的正则表达式测试工具
  2. chrome 还是正则匹配的插件Regular Expression Checker

关于本人:
国内小硕,半路出家的IT学习者
感兴趣领域:爬虫与数据科学
理念: 持续精进
Github:wuxiaoshen
weibo:乌小小申

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,445评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,889评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,047评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,760评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,745评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,638评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,011评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,669评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,923评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,655评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,740评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,406评论 4 320
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,995评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,961评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,023评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,483评论 2 342

推荐阅读更多精彩内容

  • iOS中使用正则表达式就不得不提NSRegularExpression,所以我们需要先搞清楚什么是NSRegula...
    sunmumu1222阅读 2,331评论 0 4
  • QDrive Quests Q型驱动领导力任务: Day 51 Challenge: Plan out a cha...
    QDrive阅读 218评论 11 2
  • 那个时候的你,是最好的你。而很久很久以后的我却再也没有遇见最好的你 我最近我要走了,我慢慢的整理着书柜。我要离开你...
    七号站阅读 254评论 12 6
  • 夏日炎炎,荷花静静开放依是美丽,可是这同时也是毕业的我们,读书的时候厌烦上学,可当毕业的时候我们又依依不...
    迷小鹿阅读 217评论 0 0
  • 在他乡,忆家乡。 想起并谈到家乡,是一件让人欣慰自豪的事情。 六岁的时候离开生我养我的故乡随父母为生活踏上异乡。村...
    Lyingnow阅读 173评论 0 1