第23天常用模块四(代码片段)

huwentao huwentao     2023-01-09     401

关键词:

介绍的模块

re模块
subprocess模块

人生三问

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

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

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

正则表达式:

‘‘‘
正则表达式
位置匹配
    A 开头
     结尾
    ^  开头
    $  结尾
范围匹配
    d   数字   (D相反是非数字)
    w   数字字母下划线  (W相反)
    s   空字符(	
f) (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, 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
b)  # 不能匹配换行符
[]
>>> re.findall(a.b, a
b, re.S)  # 只要加上这个参数就可以匹配换行符
[a
b]
>>> re.findall(a.b, a
b, re.DOTALL)
[a
b]
# 重复匹配之 * 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(ab2, abbb)  # 匹配了b两次
[abb]
>>> re.findall(ab2,4,abbb) # 匹配字符2次到四次
[abbb]
>>> re.findall(ab1,, abbb)  # 匹配1次或者多次,默认贪婪匹配,所以匹配了三次
[abbb]
>>> re.findall(ab0,, 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 = ac
# 方法一:四个斜杠
print(re.findall(a\\c, text))
# 方法二: r + 两个斜杠
print(re.findall(ra\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(d2)  # 直接把字符串编译成对象之后可以通过方法去直接调用
>>> 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, r52341, 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, r321, text))  # 根据分组去获得我们的值

方法四:split

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

模块二:subprocess

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

方法:Popen

标准输出

import subprocess

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

标准错误输出

import subprocess

cmd = d H:python_studyday23 | 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_studyday23
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))

 





















100天精通andriod逆向——第1天:adb原理及其常用命令(代码片段)

目录一、介绍二、工作原理三、ADB的配置四、ADB常见命令及选项4.1adbhelp/adb--help查看帮助4.2adbversion显示adb版本及所在路径4.3adbdevices显示连接的设备列表4.4adbpush文件路径目标路径(以/开头)推送电脑的文件到手机4.5adbpull文件路径(... 查看详情

100天精通python(数据分析篇)——第49天:初识numpy模块(代码片段)

文章目录每篇前言一、初识numpy模块1.numpy介绍2.ndarray对象介绍3.numpy下载二、numpy模块的基本使用1.numpy数据类型2.创建数组3.Ndarray数组属性三、元素操作1.索引和切片2.布尔索引3.广播原则4.轴(axis)四、书籍每篇前言🏆🏆作... 查看详情

第97天:图像库pil(代码片段)

...,打开了PIL的神秘面纱。这节我们接着讲PIL的Image模块的常用方法。Image模块的方法convertImage.convert(mode=None,matrix=None,dither=None,palette=0,colors=256)参数说明:mode:转换的模式matrix:可选转变矩阵。如果给出,必须为包含浮点值长 查看详情

100天精通python(爬虫篇)——第47天:selenium自动化操作浏览器(代码片段)

...位4.元素操作5.前进后退6.执行js7.页面等待隐式等待(常用)显式等待(了解)三、进阶操作1.使用代理ip2.修改请求头3.隐藏浏览器指纹特征四、书籍推荐每篇前言🏆Ἴ 查看详情

简洁易懂,初学者挑战学习python编程30天(代码片段)

...环境第24天-统计24.1统计数据24.2什么是数据?24.3统计模块24.4NumPy24.5导入NumPy2 查看详情

第4天:ansible模块(代码片段)

Ansible对远程服务器的实际操作实际是通过模块完成的,其工作原理如下:  1)将模块拷贝到远程服务器  2)执行模块定义的操嘴,完成对服务器的修改  3)在远程服务器中删除模块需要说明的是,Ansible中的模块是幂等的。... 查看详情

第28天(搬运os模块,import)(代码片段)

os模块os模块,没什么好解释的,就是与操作系统交互的一个接口,里面的功能能用就用  ‘‘‘os.getcwd()获取当前工作目录,即当前python脚本工作的目录路径os.chdir("dirname")改变当前脚本工作目录;相当于shell下cdos.curdir返... 查看详情

100天精通andriod逆向——第1天:adb原理及其常用命令(代码片段)

目录一、介绍二、工作原理二、ADB的配置三、ADB常见命令及选项3.1adbhelp/adb--help查看帮助3.2adbversion显示adb版本及所在路径3.3adbdevices显示连接的设备列表3.4adbpush文件路径目标路径(以/开头)推送电脑的文件到手机3.5adbpull文件路径(... 查看详情

100天精通oracle-实战系列(第23天)oracle数据泵用户导出导入(代码片段)

Oracle数据泵用户导出导入->返回总目录<-介绍PS:有日子没写东西了,忙的屁股都找不到了,今天找到了,写一篇,没断更,对不住大家了…数据泵用户的导出导入并不难,相信大家也都会,这里我主要讲一些大家可能不知道... 查看详情

100天精通oracle-实战系列(第23天)oracle数据泵用户导出导入(代码片段)

Oracle数据泵用户导出导入->返回总目录<-介绍PS:有日子没写东西了,忙的屁股都找不到了,今天找到了,写一篇,没断更,对不住大家了…数据泵用户的导出导入并不难,相信大家也都会,这里我主要讲一些大家可能不知道... 查看详情

100天精通python(数据分析篇)——第62天:pandas常用统计方法与案例(代码片段)

文章目录每篇前言一、常用统计方法与案例1.求和(sum)2.求平均值(mean)3.求最小值(min)4.求最大值(max)5.求中位数(median)6.求众数(mode)7.求方差(var)8.求标准 查看详情

常用模块(代码片段)

阅读目录一time与datetime模块二random模块三os模块四sys模块五shutil模块六json&pickle模块七shelve模块八xml模块九configparser模块十hashlib模块十一suprocess模块十二logging模块十三re模块一、time与datetime模块在Python中,通常有这几种方式来... 查看详情

常用模块(代码片段)

 阅读目录一time与datetime模块二random模块三os模块四sys模块五shutil模块六json&pickle模块七shelve模块八xml模块九configparser模块十hashlib模块十一suprocess模块十二logging模块十三re模块一time与datetime模块在Python中,通常有这几种方式... 查看详情

100天精通oracle-实战系列(第21天)oracle数据泵常用参数和命令(代码片段)

Oracle数据泵常用参数和命令->返回总目录<-Oracle数据泵(expdp/impdp)是从Oracle10G开始推出的新功能,作为exp/imp的替代方案,明显更新、更快和更灵活。在日常工作中,数据泵通常可用于数据迁移、同步工具... 查看详情

100天精通python(数据分析篇)——第69天:pandas常用数据筛选方法(betweenisinlociloc)(代码片段)

...;可能需要会滤掉、删除DataFrame中一些行,本文将介绍常用的筛选方法。一、布尔索引布尔索引可以用于判断和筛选>>>importpandasaspd>>>importnumpyasnp>>>>>>df=pd.DataFrame(np.random.randn(3,3),columns=['A'... 查看详情

模块小记(代码片段)

time模块1#常用方法21.time.sleep(secs)3(线程)推迟指定的时间运行。单位为秒。42.time.time()5获取当前时间戳1%y两位数的年份表示(00-99)2%Y四位数的年份表示(000-9999)3%m月份(01-12)4%d月内中的一天(0-31)5%H24小时制小时数(0-23)6%I1... 查看详情

21天学习挑战赛python学习第四篇:多线程threading模块(代码片段)

...【21天学习挑战赛】Python学习第四篇:多线程threading模块——活动地址:CSDN21天学习挑战赛——多线程的理解就是两件或两件以上的事情通过代码同时发生。而一般情况下我们写python代码的话是从上往下执行的,有一... 查看详情

100天精通python(基础篇)——第29天:标准库sys(代码片段)

文章目录前言sys作用常用变量sys.versionsys.maxsizesys.maxunicodesys.pathsys.platformsys.argvsys.executablesys.byteordersys.version_infosys.api_versionsys.stdin/sys.stdout/sys.stderr常用方法sys.exit()sys.modulessys.mod 查看详情