专栏:003:正则表达式
admin
2023-07-30 20:46:57
0

系列爬虫专栏

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

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

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]
{FNXX==XXFN} 不匹配里面内容任意值 [^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
#

特朗普是极右狂人?其实共和党候选人里,他最温和

content = r\'h3\\sid(.*?)\' #title=\"Permanent Link to 特朗普是极右狂人?其实共和党候选人里,他最温和\">特朗普是极右狂人?其实共和党候选人里,他最温和 little_title = r\'title=.*?>(.*?)\' 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:乌小小申

相关内容

热门资讯

Mobi、epub格式电子书如... 在wps里全局设置里有一个文件关联,打开,勾选电子书文件选项就可以了。
500 行 Python 代码... 语法分析器描述了一个句子的语法结构,用来帮助其他的应用进行推理。自然语言引入了很多意外的歧义,以我们...
定时清理删除C:\Progra... C:\Program Files (x86)下面很多scoped_dir开头的文件夹 写个批处理 定...
scoped_dir32_70... 一台虚拟机C盘总是莫名奇妙的空间用完,导致很多软件没法再运行。经过仔细检查发现是C:\Program...
65536是2的几次方 计算2... 65536是2的16次方:65536=2⁶ 65536是256的2次方:65536=256 6553...
小程序支付时提示:appid和... [Q]小程序支付时提示:appid和mch_id不匹配 [A]小程序和微信支付没有进行关联,访问“小...
pycparser 是一个用... `pycparser` 是一个用 Python 编写的 C 语言解析器。它可以用来解析 C 代码并构...
微信小程序使用slider实现... 众所周知哈,微信小程序里面的音频播放是没有进度条的,但最近有个项目呢,客户要求音频要有进度条控制,所...
Apache Doris 2.... 亲爱的社区小伙伴们,我们很高兴地向大家宣布,Apache Doris 2.0.0 版本已于...
python清除字符串里非数字... 本文实例讲述了python清除字符串里非数字字符的方法。分享给大家供大家参考。具体如下: impor...