内容概要

  • re模块常用方法

  • findall

  • search

  • match

  • re模块其他方法

  • split

  • sub

  • subn

  • compile

  • finditer

  • findall 对无名分组优先展示

  • re实战之爬取红牛分公司数据

内容详细

re模块常用方法

在python要想使用正则必须借助于模块,re就是其中之一

1、findall

查找字符串中所有匹配到的字符,并返回一个列表,

没有匹配数据则返回一个空列表

import re

re.findall('正则表达式','带匹配的文本')  # 根据正则匹配除所有符合条件的数据
res = re.findall('b','eva jason jackson')
print(res) # ['a', 'a', 'a']

2、search

查找字符串中的指定的字符,匹配到一个就立刻停止,并返回一个对象,需要用group方法取值

res = re.search('正则表达式','带匹配的文本')  # 根据正则匹配到一个符合条件的就结束
res = re.search('a','eva jason jackson')
print(res) # 结果对象
print(res.group()) # 正在的结果
if res:
print(res.group())
else:
print('不好意思 没有找到')

如果没有匹配到字符会返回一个None,并且调用group后会报错

3、match

查找字符串中的指定的字符,只匹配开头的字符,返回一个对象,需要用group方法取值

res = re.match('a','abac')  # 根据正则从头开始匹配(文本内容必须在开头匹配上)
print(res)
print(res.group())
if res:
print(res.group())
else:
print('不好意思 没有找到')

如果没有符合条件的数据 那么match返回None 并且使用group会直接报错

re模块其他方法

1、split

类似字符串的切割,不过这里就算切割字母左右没有字符也会切割出一个空 ""

import re
先按'a'分割得到''和'bcd',在对''和'bcd'分别按'b'分割
res = re.split('[ab]','abcd')
print(res) # ['', '', 'cd']

2、sub

类似字符串内置方法的replace

# 类似于字符串类型的replace方法
res = re.sub('\d','H','eva3jason4yuan4',1) # 替换正则匹配到的内容
res = re.sub('\d','H','eva3jason4yuan4') # 不写默认替换所有
print(res) # evaHjason4yuan4

3、subn

替换完成后会返回一个元组 ("更换后的字符串", 被更换的个数)

"""返回元组 并提示替换了几处"""
# res = re.subn('\d','H','eva3jason4yuan4',1)
# print(res) # ('evaHjason4yuan4', 1)
# res = re.subn('\d','H','eva3jason4yuan4')
# print(res) # ('evaHjasonHyuanH', 3)

4、compile

定义一个固定的正则表达式,可以多次重复使用匹配不同的字符串

point = re.compile('<a>(.*?)</a>')
res1 = point.findall(date1)
res2 = point.search(date2)
res3 = point.match(date3)
res3 = point.finditer(date4) regexp_obj = re.compile('\d+')
res = regexp_obj.search('absd213j1hjj213jk')
res1 = regexp_obj.match('123hhkj2h1j3123')
res2 = regexp_obj.findall('1213k1j2jhj21j3123hh')
print(res,res1,res2)

5、finditer

与findall的作用一致,但findall返回的是一个列表,当数据量很大,会特别占用内存空间

而finditer会返回一个可迭代对象,当需要数据时,迭代获取即可

# res = re.finditer('\d+','ashdklah21h23kj12jk3klj112312121kl131')
# print([i.group() for i in res])

6、search对分组的索引取值展示

# res = re.search('^[1-9](\d{14})(\d{2}[0-9x])?$','110105199812067023')
# print(res)
# print(res.group()) # 110105199812067023
# print(res.group(1)) # 10105199812067
# print(res.group(2)) # 023

7、findall 对无名分组优先展示

findall针对分组优先展示 无名分组

res = re.findall("^[1-9]\d{14}(\d{2}[0-9x])?$",'110105199812067023')
print(res) # ['023']

取消分组优先展示 无名分组

res1 = re.findall("^[1-9](?:\d{14})(?:\d{2}[0-9x])?$",'110105199812067023')
print(res1)

8、有名分组

res = re.search('^[1-9](?P<xxx>\d{14})(?P<ooo>\d{2}[0-9x])?$','110105199812067023')
print(res)
print(res.group()) # 110105199812067023
print(res.group(1)) # 10105199812067 无名分组的取值方式(索引取)
print(res.group('xxx')) # 10105199812067
print(res.group('ooo')) # 023

正则实战案例

1、登录红牛官网 点击分支结构网页 http://www.redbull.com.cn/about/branch

2、如图所示,爬取所有分公司名称,地址,邮箱,电话等信息

3、右键点击查看网页源代码,全选网页代码复制到pychram的文件中

4、新建py文件,打开并读取网页源码文件,用正则表达式筛选分公司信息

import re

# 读取带匹配的数据
with open(r'a.txt', 'r', encoding='utf8') as f:
data = f.read()
# 利用正则匹配数据
# 分公司名称
title_list = re.findall('<h2>(.*?)</h2>', data)
# print(title_list)
# 分公司地址
address_list = re.findall("<p class='mapIco'>(.*?)</p>", data)
# print(address_list)
# 分公司邮箱
email_list = re.findall("<p class='mailIco'>(.*?)</p>", data)
# print(email_list)
# 分公司电话
phone_list = re.findall("<p class='telIco'>(.*?)</p>", data) res = zip(title_list, address_list, email_list, phone_list)
for data_tuple in res:
print("""
公司名称:%s
公司地址:%s
公司邮箱:%s
公司电话:%s
""" % (data_tuple[0], data_tuple[1], data_tuple[2], data_tuple[3]))

python内置模块之re模块的更多相关文章

  1. Python内置模块和第三方模块

    1.Python内置模块和第三方模块 内置模块: Python中,安装好了Python后,本身就带有的库,就叫做Python的内置的库. 内置模块,也被称为Python的标准库. Python 2.x ...

  2. python内置模块(time模块)

    常用的python内置模块 一.time模块 在python的三种时间表现形式: 1.时间戳,给电脑看的. - 自1970-01-01 00:00:00到当前时间,按秒计算,计算了多少秒. impor ...

  3. 8.python内置模块之random模块简介

    Python中的random模块用于生成随机数. 常用的7个函数: 1.random.random():返回一个[0,1)之间的随机浮点值(双精度) 2.random.uniform(a,b):返回[ ...

  4. Python内置模块之time模块

    1:概述 时间表示的分类 时间戳 格式化的时间字符串 结构化时间 时间戳:时间戳表示的是从1970年1月1日整0点到目前秒的偏移量,数据类型是浮点型,主要用来让计算机看的 格式化的时间字符串:如 20 ...

  5. Python 内置模块:os模块

    Python os模块包含普遍的操作系统功能.如果你希望你的程序能够与平台无关的话,这个模块是尤为重要的.(一语中的) 二.常用方法 1.os.name 输出字符串指示正在使用的平台.如果是windo ...

  6. 13.python内置模块之re模块

    什么是正则? 正则表达式也称为正则,是一个特殊的字符序列,能帮助检查一个字符串是否与某种模式匹配.可以用来进行验证:邮箱.手机号.qq号.密码.url = 网站地址.ip等.正则不是python语言独 ...

  7. 12.python内置模块之sys模块介绍

    python的sys模块是与python解释器交互的一个接口,提供对解释器使用或维护的一些变量的访问,即与解释器强烈交互的函数. sys模块的常用函数: 1.sys.argv:命令行参数列表.第一个元 ...

  8. 10.python内置模块之os模块

    os模块的作用:os 模块提供了非常丰富的方法用来处理文件和目录(管理和维护目录以及文件). os.path模块的作用:主要用于获取文件的属性(管理路径的(物理地址)). 小生总结了一些平时常用到的属 ...

  9. Python内置模块之序列化模块

    序列化模块 json dumps loads dump load pickle dumps loads dump load shelve json 1: dumps/loads import json ...

随机推荐

  1. react中自定义antd主题与支持less(第二部)

    自定义主题 首先自定义主题需要修改antd,antd本身也是less写的之后编译成css的,所以当我们需要使用less. 1.yarn add react-app-rewire-less --dev ...

  2. k8s中初始化容器(init container)的作用及其使用方法

    概述 在容器的部署过程中,有的时候需要在容器运行之前进行一些预配置的工作,比如下载配置,判断某些服务是否启动,修改配置等一些准备的工作,想要实现这些功能,在k8s中可以使用初始化容器,在应用容器运行之 ...

  3. sql创建表格时出现乱码

    1.新建数据库时,第一次只填写了数据库名称保存数据库,如下图: 2.创建一个Student表格,代码如下,其中有数据有中文,创建完后查看表格数据,发现中文为乱码 create table Studen ...

  4. 微软的Serialize和Newtonsoft的SerializeObject比较

    微软的序列化反序列化组件出来已有好几年了,刚出来的时候各种吐槽.最近在优化代码,比较了一下微软的Serialize和Newtonsoft的SerializeObject,感觉大部分场景下可以用微软的序 ...

  5. MRCTF2020 套娃

    MRCTF2020套娃 打开网页查看源代码 关于$_SERVER['QUERY_STRING']取值,例如: http://localhost/aaa/?p=222 $_SERVER['QUERY_S ...

  6. Java中的常用类——Arrays

    数组工具类java.util.Arrays Arrays类中的方法都是static修饰的静态方法,因此可以直接使用类名.方法名来调用,而不用通过new使用对象来调用(是"不用"不是 ...

  7. 【记录一个问题】thanos receiver的日志中出现错误:conflict

    完整的错误如下: level=debug ts=2021-08-16T09:07:43.412451Z caller=handler.go:355 component=receive componen ...

  8. StringBuffer类(增删改查及长度可变原理)

    1 package cn.itcast.p2.stringbuffer.demo; 2 3 public class StringBufferDemo { 4 5 public static void ...

  9. linux安装第三方软件 python3

    一:linux安装python3 安装第三方软件的目录 进入目录 /usr/local 下载rpm安装包 安装pyton yum安装python : yum install python3 查看pyt ...

  10. python变量系列--1

    所以这里需要注意变量的使用,print(message),直接去引用,和shell略有不同 1.变量名只能包含字母,数字,下划线,但不能以数字开头 2.变量名不能含有空格