我的编程空间,编程开发者的网络收藏夹
学习永远不晚

第23天 常用模块四

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

第23天 常用模块四

介绍的模块

re模块
subprocess模块

人生三问

什么re模块
    主要是与正则表达式相关操作的一些方法

什么是正则表达式
    就是一系列特殊意义字符的组成的式子。

为什么要用正则表达式呢?
    在日常生活中我们获得的数据大部分都是一大串的字符串,但是通常情况下我们并不是需要整个字符串,我们需要的是一些有规律的数据,怎么去把他们提取出来就变成了一个难题,
   这个时候正则表达式就出现了,我们可以通过写的一些正则表达式对字符串进行分析提取,最后获得我们需要的内容。

正则表达式:

'''
正则表达式
位置匹配
    \A 开头
    \Z 结尾
    ^  开头
    $  结尾
范围匹配
    \d   数字   (\D相反是非数字)
    \w   数字字母下划线  (\W相反)
    \s   空字符(\t\n\f\b) (\s相反)
    [...]   手动指定范围,ascii码表返回
    [^...]  指定范围以外的内容
重复匹配 
    *   0次或者多次
    +   一次或者多次
    ?   0次或者一次     非贪婪模式
    {n} 精确匹配前面n个表达式
    {n, m} 匹配n到m次由前面的正则表达式定义的片段,贪婪模式
    
分组    
    ()括号内的表达式是一个分组
'''

示例一:单个字符的匹配

>>> import re
>>> re.findall('\w', 'hello egon 123')
['h', 'e', 'l', 'l', 'o', 'e', 'g', 'o', 'n', '1', '2', '3']
>>> re.findall('\W', 'hello egon 123')
[' ', ' ']
>>> re.findall('\d', 'hello egon 123')
['1', '2', '3']
>>> re.findall('\D', 'hello egon 123')
['h', 'e', 'l', 'l', 'o', ' ', 'e', 'g', 'o', 'n', ' ']
>>> re.findall('\s', 'hello egon 123')
[' ', ' ']
>>> re.findall('\S', 'hello egon 123')
['h', 'e', 'l', 'l', 'o', 'e', 'g', 'o', 'n', '1', '2', '3']
>>> re.findall('\Ahe', 'hello egon 123')
['he']
>>> re.findall('^he', 'hello egon 123')
['he']
>>> re.findall('3$', 'hello egon 123')
['3']
>>> re.findall('3\Z', 'hello egon 123')
['3']

示例二:重复匹配

# 重复匹配之.
>>> re.findall('a.b', 'a1b')  # 任意字符
['a1b']
>>> re.findall('a.b', 'a1b a*b a b aaab')
['a1b', 'a*b', 'a b', 'aab']
>>> re.findall('a.b', 'a\nb')  # 不能匹配换行符
[]
>>> re.findall('a.b', 'a\nb', re.S)  # 只要加上这个参数就可以匹配换行符
['a\nb']
>>> re.findall('a.b', 'a\nb', re.DOTALL)
['a\nb']
# 重复匹配之 * 0次或者多次
>>> re.findall('ab*', 'bbbbbb') # 没有匹配到前面的a
[]
>>> re.findall('ab*', 'a')  # 匹配了b零次
['a']
>>> re.findall('ab*', 'abbbb')  # 匹配了b多次
['abbbb']
# 重复匹配之? 0次或者一次
>>> re.findall('ab?', 'a')  # 匹配了b零次
['a']
>>> re.findall('ab?', 'abbbb')  # 匹配了b1次
['ab']
# 重复匹配之 + 1次或者多次
>>> re.findall('ab+', 'a')  # 没有匹配到b
[]
>>> re.findall('ab+', 'ab')  # 匹配了b1次
['ab']
>>> re.findall('ab+', 'abbbbb') # 匹配了b多次
['abbbbb']

示例三:{ }, [ ]的使用

正则表达式之{}
{2} 匹配前面模式两次
{2,4}匹配前面模式两到四次,注意中间不能加空格
>>> re.findall('ab{2}', 'abbb')  # 匹配了b两次
['abb']
>>> re.findall('ab{2,4}','abbb') # 匹配字符2次到四次
['abbb']
>>> re.findall('ab{1,}', 'abbb')  # 匹配1次或者多次,默认贪婪匹配,所以匹配了三次
['abbb']
>>> re.findall('ab{0,}', 'abbb') # 匹配0次或者多次,默认贪婪匹配,所以匹配了三次
['abbb']
>>>

正则表达式之[]
[abcd] 匹配[]里面的任何字符
>>> re.findall('a[1*-]b', 'a1b a*b a-b')  # a和b是固定的,但是中间的值可以是1 * -
['a1b', 'a*b', 'a-b']
>>> re.findall('a[^1*-]b', 'a1b a*b a-b a=b') # ^代表a和b之间不能是[]内的任意字符
['a=b']
>>> re.findall('a[0-9]b', 'a1b a*b a-b a=b')   # ab之间可以是0-9之间的数字
['a1b']
>>> re.findall('a[a-z]b', 'a1b a*b a-b asb')   # ab之间是a-z之间的数字
['asb']
>>> re.findall('a[A-Z]b', 'aSb a*b a-b asb')    # ab之间是A-Z之间的数字
['aSb']
>>> re.findall('a[A-Za-z]b', 'aSb a*b a-b asb')  # ab之间是A-Z,a-z之间的数字
['aSb', 'asb']

匹配网址
import re

print(re.findall('href=".*?"', '<a href="http://www.baidu.com">点击</a>'))
# 结果:['href="http://www.baidu.com"']
print(re.findall('href="(http.*?)"', '<a href="http://www.baidu.com">点击</a>'))
# 结果 ['http://www.baidu.com']

示例四: 分组

#():分组
print(re.findall('ab+','ababab123')) #['ab', 'ab', 'ab']
print(re.findall('(ab)+123','ababab123')) #['ab'],匹配到末尾的ab123中的ab
print(re.findall('(?:ab)+123','ababab123')) #findall的结果不是匹配的全部内容,而是组内的内容,?:可以让结果为匹配的全部内容

示例五:【\】的使用

# 因为python在使用正则表达式的时候是要交给底层的c去执行的
# 因此python解释器首先要保证让自己去识别斜杠的时候是正确的,这个时候需要两个斜杠
# 当时当传到底层的c去执行的时候,需要把让c也知道这个是普通的字符,因此还需要两个斜杠
text = 'a\c'
# 方法一:四个斜杠
print(re.findall('a\\\\c', text))
# 方法二: r + 两个斜杠
print(re.findall(r'a\\c', text))
# 结果:
# ['a\\c']
# ['a\\c']

re模块的方法

re模块的方法
    findall  返回所有满足匹配条件的值放在一个列表中
    search   在整个字符串中寻找一个匹配的值
    match  从字符串的开头寻找一个匹配的值
    split  按照一个模式进行分割
    sub   替换字符串
   complie  编译

方法一: 匹配

>>> import re
>>> re.findall('e', 'alex make love') # 在字符串中查找出所有的e放在一个列表中
['e', 'e', 'e']
>>> re.search('e', 'alex make love') # 在字符串中查找出一个e返回一个对象,可以通过group去获得相应的值
<_sre.SRE_Match object; span=(2, 3), match='e'>
>>> re.search('e', 'alex make love').group(0)
'e'
>>> re.match('e', 'alex make love') # 在字符串的开头查找e发现没有,所以没有返回值,方法match可以被search + ^方法所取代
>>>

方法二:compile

>>> obj = re.compile('\d{2}')  # 直接把字符串编译成对象之后可以通过方法去直接调用
>>> obj.search('abc123eeee').group()  # 对象直接调用search去查找对应的值
'12'
>>> obj.findall('abc123eeee')  #对之前编译的对象进行了重用
['12']
>>>

方法三: sub

# 替换字符串,第一个给匹配模块,第二个为替换对象,第三个为字符串,第四个是替换几个
>>> re.sub('a', 'A', 'alex make love') 'Alex mAke love' >>> re.sub('a', 'A', 'alex make love', 1) 'Alex make love' >>> re.sub('a', 'A', 'alex make love', 2) 'Alex mAke love' >>>

应用一:将字符串的alex make love的第一个字符串和第三个字符串进行替换====》love make alex

# alex make love ===>love make alex
text = 'alex make love'
# 首先用正则表达式去表示我们的字符串,表示成五组,[('alex', ' ', 'make', ' ', 'love', '')]
pattern = '^(\w+)(.*?\s)(\w+)(.*?\s)(\w+)(.*?)$'
# print(re.findall(pattern, text))
print(re.sub(pattern, r'\5\2\3\4\1', text))

应用二:将字符"java|C++|js|C|python"替换成python|C++|js|C|java

# 将字符串java与python进行替换
text = "java|C++|js|C|python"   # 这是一段字符串
pattern = '(.+?)(\|.+\|)(.+)'  # 首先通过正则表达式去描述我们的字符串,并且分组
# print(re.findall(pattern, text))
print(re.sub(pattern, r'\3\2\1', text))  # 根据分组去获得我们的值

方法四:split

print(re.split("\|_*\|","python|____|js|____|java"))

模块二:subprocess

subprocess
    这是一个可以与其他进程进行数据交互的模块。
os.system
  也可以和其他的进程进行交换,但是不能进行数据交互,我们只能得到一个状态码。
两个输出,一个输入
  stdout 标准输出
  stdin  标准输入
  stderr 标准错误输出

方法:Popen

标准输出

import subprocess

cmd = 'dir H:\python_study\day23 | findstr "py"'
# 创建了一个子进程, 把命令,标准输出
sub = subprocess.Popen(cmd, stdout=subprocess.PIPE, shell=True)
# 得到的是系统的编码方式,是gbk的编码方式
print(sub.stdout.read().decode('gbk'))

标准错误输出

import subprocess

cmd = 'd H:\python_study\day23 | findstr "py"'
# 创建了一个子进程, 把命令,标准输出
sub = subprocess.Popen(cmd, stdout=subprocess.PIPE, shell=True, stderr=subprocess.PIPE)
# 得到的是系统的编码方式,是gbk的编码方式
# print(sub.stdout.read().decode('gbk'))
# 这个是当错误发生的时候会给我们返回一个标准错误输出
print(sub.stderr.read().decode('gbk'))

标准输入:

cmd = 'dir H:\python_study\day23'
find = 'findstr "py"'

sub1 = subprocess.Popen(cmd,
                        stdout=subprocess.PIPE,
                        shell=True,)
# 把sub1的标准输出输入到sub2的输入中
sub2 = subprocess.Popen(find,
                        stdout=subprocess.PIPE,
                        stdin=sub1.stdout)

print(sub2.stdout.read().decode('gbk'))

 

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

第23天 常用模块四

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

第23天 常用模块四

介绍的模块re模块subprocess模块人生三问什么re模块 主要是与正则表达式相关操作的一些方法什么是正则表达式 就是一系列特殊意义字符的组成的式子。为什么要用正则表达式呢? 在日常生活中我们获得的数据大部分都是一大串
2023-01-30

第22天 常用模块三

介绍的模块logginghashlib 模块一:logging人生三问什么是日志  对每天所发生的事情做的记录就是日志。为什么要用日志  日志记录了我们程序每天发生了什么事情,这个对于我们程序的维护有很大的帮助。例如每天都会有同一个ip在尝
2023-01-30

学习python的第二十天(json模块

1.josn模块(用于指定数据类型文件快速读写修改)1.指定的数据类型dict(字典)str(字符串)int/float(整型/浮点型)bool中的False,True,None2.dumps/loadsloads用于内存中修改,把dump
2023-01-31

学习python的第二十天(time模块

1.三种时间的显示样式1.时间戳1.相关函数1.time()2.显示样式import timeprint(time.time())#1560150343.5837357 距离计算机元年1970年1月1日00:00:0的过去了多少秒2.结构化
2023-01-31

学习python的第二十天(os模块,s

1.os模块(功能类似操作系统与文件交互)1.常用模块功能1.创建文件1.mkdir2.移除文件1.remove删除指定文件2.rmdir删除单级空目录,若目录不为空则无法删除3.removedirs若目录为空,则删除,并递归到上一级目录,
2023-01-31

hadoop常用四大模块文件是什么

本篇内容介绍了“hadoop常用四大模块文件是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1.core-site.xml(工具模块)。
2023-06-02

常用模块 - configparse模块

一、简介configparser模块在Python中是用来读取配置文件的,配置文件的格式跟windows下的ini配置文件相似,可以包含一个或多个节点(section),每个节可以有多个参数(键=值)。二、生成配置文件#! /usr/bin
2023-01-31

常用模块 - openpyxl模块

一、简介xlrd/xlwt         主要是针对Office 2003或更早版本的XLS文件格式         缺点:不支持XLSX文件格式OpenPyXL         能读能写能修改         缺点:不支持XLSMicr
2023-01-31

常用模块 - hashlib模块

一、简介Python的hashlib提供了常见的摘要算法,如MD5、SHA1、SHA224、SHA256、SHA384、SHA512等算法。什么是摘要算法呢?摘要算法又称哈希算法、散列算法。它通过一个函数,把任意长度的数据转换为一个长度固定
2023-01-31

学习python的第十八天(模块导入及使

一.模块导入及使用1.模块导入的两种方式我们拿time模块并使用其中的time功能进行举例a)第一种import timeprint(time.time)import首次导入模块发生了3件事:打开模块文件执行模块对应的文件,将执行过程中产生
2023-01-31

常用模块3

一.正则表达式  英文全称: Regular Expression. 简称 regex或者re.正则表达式是对字符串操作的一种逻辑公式. 我们一般使用正则表达式对字符串进行匹配和过滤. 使用正则的优缺点:  优点: 灵活, 功能性强, 逻辑
2023-01-30

python常用模块

collections模块namedtuple#命名元组#生成可以使用名字来访问元素内容的tuplefrom collections import namedtuplePoint = namedtuple('point',['x','y']
2023-01-30

python3:常用模块

calendartimedatetimetimeitosshutilzipmathstring上述所有模块使用理论上都应该先导入,string是特例calendar,time,datetime的区别参考中文意思关于log模块请参考:log模
2023-01-31

Python 常用模块

1、ConfigParser模块:说明: 读取配置文件http://wangwei007.blog.51cto.com/68019/1104911    2、SQLAlchemy说明:数据库操作模块http://blog.sina.com.
2023-01-31

常用的python模块

一、time与datetime模块1、在Python中,通常有这几种方式来表示时间:时间戳(timestamp):通常来说,时间戳表示的是从1970年1月1日00:00:00开始按秒计算的偏移量格式化的时间字符串(Format String
2023-01-31

[python] os.path模块常用

os.path.abspath(path) #返回绝对路径os.path.basename(path) #返回文件名os.path.commonprefix(list) #返回list(多个路径)中,所有path共有的最长的路径。os.pa
2023-01-30

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录