Python学习Day9(中) ---- 正则表达式

1. 概述

所谓正则表达式是一个特殊的字符序列,它能检查一个字符串是否与某种模式匹配。
python中有标准库模块re,使得python有全部的正则表达式能力,以下介绍python中常用的几种正则表达式函数。

2. re.match()

尝试从字符串的起始位置匹配一个模式,匹配成功返回match对象,否则返回None

import re
tel_reg = '^1[0-9]{10}$'
r1 = re.match(tel_reg, '12345678910')
r2 = re.match(tel_reg, '123456789ab')
print(r1)
print(r2)
>>> <re.Match object; span=(0, 11), match='12345678910'>
>>> None

上面的例子是匹配以1开始的并以数字结尾11位数号码,其中

  • ^ 表示以XX开始, $ 表示以XX结束;
  • [ ] 中括号中的字符可以全部匹配,[^ ] 表示不匹配;
  • { 10 }规定量词, 表示出现10次,{1, }出现1次以上,{1, 10}出现1--10次;
  • ( )小括号可以对正则分组,group(0)或group()返回所有匹配内容,group(n)返回第n组内容。

3. re.search()

扫描整个字符串并返回以一个成功的匹配

import re
content = 'aaa121aad323ddd'
reg = '\d+'
re = re.search(reg, content)
print(re.span())
print(re.group())
>>> (3, 6)
>>> 121

匹配字符串中第一次出现的数字,span()函数可以获取索引
match和search的区别:match会匹配字符串的开始,如果一开始不符合正则,那么匹配就会失败,返回None,而search会匹配整个字符串,直到找到一个匹配的。

4. re.findall()

查找所有符合的匹配项,返回一个列表,如果没有匹配到则返回空列表
下面利用 findall() 函数爬取猫眼电影榜单数据


猫眼电影榜单
import requests
import re

def html_data(page):
    offset = 'offset=' + str((page - 1) * 10)
    url = 'https://maoyan.com/board/4?' + offset
    response = requests.get(url).text
    return response

def find_name(html_text):
    reg = '.*?name.*?<a.*?>(.*?)</a>'
    r = re.findall(reg, html_text)
    return r

def find_star(html_text):
    reg = '.*?star.*?>(.*?)</p>'
    r = re.findall(reg, html_text, re.S)
    return list(map(str.strip, r))

def find_time(html_text):
    reg = '.*?releasetime.*?>(.*?)</p>'
    r = re.findall(reg, html_text, re.S)
    return r

def find_score(html_text):
    reg1 = '.*?score.*?<i.*?integer.*?>(.*?)</i>'
    reg2 = '.*?score.*?<i.*?fraction.*?>(.*?)</i>'
    r1 = re.findall(reg1, html_text, re.S)
    r2 = re.findall(reg2, html_text, re.S)
    score = []
    for i, j in zip(r1, r2):
        k = str(i) + str(j)
        score.append(k)

    # score = list(zip(r1, r2))
    # rs = map(lambda x: str(x[0]) + str(x[1]), score)   # 用map函数

    return score

def get_move_data(html_text):
    name_list = find_name(html_text)
    star_list = find_star(html_text)
    time_list = find_time(html_text)
    score_list = find_score(html_text)
    for name, star, time, score in zip(name_list, star_list, time_list, score_list):
        yield {
            'name': name,
            'star': star,
            'time': time,
            'score': score
        }

def show(page):
    move_list = list(get_move_data(html_data(page)))
    for move in move_list:
        print('电影名称:' + move['name'])
        print('评分:' + move['score'])
        print(move['star'])
        print('上映时间:' + move['time'])
        print('-' * 100 + '\n')

show(1)
运行结果

5. 其他

  • re.sub()
    替换符合格式的内容
import re
content = '12adasdasd'
reg = '\d+'
r = re.sub(reg, '', content) # 把数字替换空字符
print(r)
>>> adasdasd
  • re.I 和 re.S
    re.I忽略大小写,re.S使之可以匹配包括换行符在内的所有字符
  • compile()
    用于编译正则表达式,生成一个正则表达式( Pattern )对象,供 match() 、 search()和sub()等函数使用。
import re
c1 = '2019-6-29 14:10'
c2 = '2019-9-13 17:40'
p = re.compile('\d{2}:\d{2}')
print(re.sub(p, '', c1))
print(re.sub(p, '', c2))
>>> 2019-6-29 
>>> 2019-9-13 

更多语法和字符含义可直接百度

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • Python中的正则表达式(re) import rere.match #从开始位置开始匹配,如果开头没有则无re...
    BigJeffWang阅读 12,123评论 0 99
  • 搞懂Python 正则表达式用法 Python 正则表达式 正则表达式是一个特殊的字符序列,它能帮助你方便的检查一...
    厦热阅读 5,595评论 0 2
  • re模块手册 本模块提供了和Perl里的正则表达式类似的功能,不关是正则表达式本身还是被搜索的字符串,都可以...
    喜欢吃栗子阅读 9,513评论 0 13
  • #首先,python中的正则表达式大致分为以下几部分: 元字符 模式 函数 re 内置对象用法 分组用法 环视用法...
    mapuboy阅读 5,556评论 0 51
  • 三妞是北京一家著名公司的HR,在筛选简历招聘人员时,当看到与自己毕业于同一个学校,来自同一个地方的赵小薇时,坐在...
    幸福happy阅读 7,970评论 19 10

友情链接更多精彩内容