前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >专栏:003:正则表达式

专栏:003:正则表达式

作者头像
谢伟
发布2018-06-06 11:41:55
5980
发布2018-06-06 11:41:55
举报
文章被收录于专栏:GopherCoderGopherCoder

系列爬虫专栏

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

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

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

匹配不是单词开头或结束的位置

看不懂,那算了。

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

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

  • 眼见为实
代码语言:javascript
复制
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:

代码语言:javascript
复制
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)

替换掉符合要求的字符串,常用来替换网址的组成

代码语言:javascript
复制
# 假设你对下面这个博客首页的文章的标题感兴趣.
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浏览器

代码语言:javascript
复制
# 假设你想匹配首页的课程图片
# -*- 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:乌小小申

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2016.04.27 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1:框架
  • 2:概念
  • 3:语法
  • 4:代码实例
  • 4:参考及备注
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档