爬虫(四) 正则表达式及其应用(用于数据解析)

本文深入解析正则表达式的规则与应用,涵盖基础字符、数量修饰、边界、分组及模式匹配等核心概念,通过实例展示如何使用Python进行字符串匹配、搜索与替换。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

正则表达式是用来匹配一类具有相同规则的字符串。

规则:

单字符:

. :除换行以外的所有字符。

[]:[aoe] [a-w]  匹配集合中的任意一个字符

\d:数字 [0-9]

\D:非数字

\w:数字、字母、下划线、中文

\W:非\w

\s:所有的空白字符

\S:非空白

 

数量修饰:

* :任意多次。>=0

+:至少一次。>=1

?:可有可无      0次或者1次

{m}:固定m次

{m,} : 至少m次

{m,n}:m-n次

 

边界:

\b \B

$ :以..结尾

^ :以..开始

 

分组:

() : 视为一个整体

()  \1 \2 : 子模式

 

贪婪模式:

.*? , .+?

re.I :忽略大小写。

re.M:多行匹配。

re.S:单行匹配。

 

match:从开头开始找。

search:从任意位置开始找。

findall:

 

正则替换:

re.sub(正则表达式,替换内容,字符串)

可以用一个函数作为参数

 

下面是一个简单的用正则表达式匹配字符串的例子:

import re

string = '<p><div><span>猪八戒</span></div></p>'
pattern = re.compile(r'<(\w+)><(\w+)>\w+</\2></\1>')

ret = pattern.search(string)
print(ret)

下面是贪婪模式的应用例子:

import re

string = '<div>猪八戒</div></div></div>'
pattern = re.compile(r'<\w+>.*</\w+>')
pattern2 = re.compile(r'<\w+>.*?</\w+>')

ret = pattern.search(string)
ret2 = pattern2.search(string)
print(ret)
print(ret2)

运行结果:

<re.Match object; span=(0, 26), match='<div>猪八戒</div></div></div>'>
<re.Match object; span=(0, 14), match='<div>猪八戒</div>'>

 

下面是正则替换的例子:

import re

string = 'you are my dsds'

pattern = re.compile(r'dsds')
ret = re.sub(r'dsds', 'a', string)  \1
用a在string中替换dsds
ret = pattern.sub('aaa', string)    \2
# 用aaa在string替换pattern中的内容

print(ret)

1的运行结果是:

you are my a

2的运行结果是:

you are my aaa

 

 

利用正则函数进行替换

import re

def fn(a):
    ret = int(a.group())
    return str(ret - 10)

string = '178是最受欢迎的身高'

pattern = re.compile(r'\d+')
ret = pattern.sub(fn, string)

print(ret)

 

下面是一个爬去语录网的标题和文章的例子(用的是正则表达式进行匹配):

'''
将网站的标题和内容爬取下来
'''

import urllib.request
import urllib.parse
import re


def get_text(url, title):
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) '
                      'AppleWebKit/537.36 (KHTML, like Gecko)'
                      ' Chrome/63.0.3239.132 Safari/537.36',
    }
    request = urllib.request.Request(url, headers=headers)
    response = urllib.request.urlopen(request).read().decode()
    # 写一个正则移除网页中的全部图片
    # pattern_s = re.compile(r'<img src=".*?" title=".*?" alt=".*?" .*?>')
    # pattern_s.sub('', response)
    pattern = re.compile(r'<div class="neirong">(.*?)</div>', re.S)
    lt = pattern.findall(response)
    # print(lt)
    with open('lizhi.html', 'a', encoding='utf8') as fp:
        fp.write(title + '\n\n\n' + lt[0])


def response_buile(url):
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) '
                      'AppleWebKit/537.36 (KHTML, like Gecko)'
                      ' Chrome/63.0.3239.132 Safari/537.36',
    }
    # 构建请求
    request = urllib.request.Request(url=url, headers=headers)
    # 获取响应
    response = urllib.request.urlopen(request).read().decode()
    # print(response)
    # 构建正则表达式进行筛选
    pattern = re.compile(r'<li>.*?<a href="(.*?).html">(.*?)</a>.*?</li>', re.S)
    lt = pattern.findall(response)
    # print(lt)
    for it in lt:
        url_g = 'http://www.yikexun.cn' + it[0] + '.html'
        # print(url_g)
        get_text(url_g, it[-1])


def main():
    url = 'http://www.yikexun.cn/niandujingdianyulu/2013yulu/list_60_'
    # 构建请求网页中共同的部分http://www.yikexun.cn/niandujingdianyulu/2013yulu/list_60_1.html
    print("一点点语录网爬取!!")
    start_page = int(input("请输入需要爬取的起始页码:"))
    end_page = int(input("请输入需要爬取的结束页码:"))
    for page in range(start_page, end_page + 1):
        print("正在爬取第%s页", str(page))
        # 构建完整的url
        url_t = url + str(page) + '.html'
        # print(url_t)
        # 根据url构建请求获取响应
        response_buile(url_t)


main()

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值