blubiu

My Love

上网不网恋,简直浪费电.


Python从0到POC编写--模块(二)


前言:

模块第二篇。


目录:


RE模块:

re 正则表达式模块,这个大家应该都比较熟悉。

语法:

re.match(pattern, string, flags=0)

其中:

pattern 是匹配的正则表达式

string 是要匹配的字符串。

flags 是标志位,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等。


正则表达式:

单字符匹配规则:

字符 功能
.(点) 匹配任意1个字符(除了\n)
[] 匹配[]中列举的字符
\d 匹配数字,0-9
\D 匹配非数字,也就是匹配不是数字的字符
\s 匹配空白符,也就是 空格\tab
\S 匹配非空白符,跟 \s 相反
\w 匹配数字、字母、下划线, a-z, A-Z, 0-9, _
\W 匹配非数字、字母、下划线

数量匹配规则:

字符 功能
* 匹配0次或者多次,可有可无
+ 匹配至少1次
? 匹配1次或者0次,要么有1次,要么没有
{m} 匹配前一个字符出现m次
{m,} 匹配前一个字符至少出现m次
{m,n} 匹配前一个字符出现m到n次

边界符:

字符 功能
^ 匹配字符串开头
$ 匹配字符串结尾
\b 表示字母数字与非字母数字的边界
\B 表示字母数字与(非非)字母数字的边界

常用函数:

方法/属性 作用
re.match(pattern, string, flags=0) 从字符串的起始位置匹配,如果起始位置匹配不成功的话,就返回none
re.search(pattern, string, flags=0) 扫描整个字符串并返回第一个成功的匹配
re.findall(pattern, string, flags=0) 匹配的所有字符串,并把他们作为一个列表返回
re.finditer(pattern, string, flags=0) 表示字母数字与(非非)字母数字的边界
re.sub(pattern, repl, string, count=0, flags=0) 替换匹配到的字符串

参数:

pattern : 匹配的正则表达式。

string : 要匹配的字符串。

flags : 用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等。

repl : 替换的字符串,也可作为一个函数。

count : 模式匹配后替换的最大次数,默认0表示替换所有匹配。


例1:

>>> import re
>>> r = re.match('www','www.baidu.com')
>>> print(r)
>>> # 输出 <re.Match object; span=(0, 3), match='www'>  span=(0, 3) 表示 匹配到的字符在0-3位,但不包含3
# 也可以 
>>> r = re.match('www','www.baidu.com').span()
>>> # 输出 (0,3)

例2:

>>> import re
>>> r = re.search('www','www.baidu.com').span()
>>> print(r)
>>> # 输出 (0, 3) 
>>> r = re.search('com','www.baidu.com').span()
>>> # 输出 (10,13)

例3:

>>> import re
>>> r = re.findall('\d','w1w2w.ba3id4u.co5m')  # \d 匹配数字
>>> print(r)
>>> # 输出 ['1', '2', '3', '4', '5']

例4:

语法: re.sub(要匹配的字符串,要替换的字符串,查找的值)

>>> import re
>>> url1 = 'www.baidu.com'   # 查找的值
>>> url2 = 'www.taobao.com'  # 要替换的字符串
>>> r = re.sub('www.baidu.com',url2,url1)
>>> print(r)
>>> # 输出 www.taobao.com 百度被替换成了淘宝

os模块

os 是一个获取和处理文件,目录 的模块,

下面列举一些比较常用的方法。


os.access() 查看文件是否有指定权限,有则返回True否则返回flase

语法: os.access(path, mode)

path 文件路径

mode 参数有:

F_OK (是否存在)

R_OK (可读)

W_OK (可写)

X_OK (可执行)


例:

>>> import os
>>> r = os.access('/python/test.py',os.F_OK)  #  判断文件是否存在
>>> print(r)
>>> # 输出 True

os.getcwd() 获取当前目录,即当前python脚本工作的目录路径

例:

>>> import os
>>> r = os.getcwd()  #  获取路径
>>> print(r)
>>> # 输出 C:\Users\administrator\Desktop

os.listdir() 获取指定目录下文件和目录的名称,跟 dir 命令一样

例:

>>> import os
>>> r = os.listdir('C:/')  #  获取目录和文件名
>>> print(r)

os.chdir() 切换工作目录到指定的路径下,成功返回True,失败返回False

例:

>>> import os
>>> r = os.chdir('../')  #  切换到上一级目录
>>> print(r)

os.mkdir(path, mode=511)

创建一个目录,并指定访问权限,在windows平台下, mode参数将会被忽略

默认的访问权限为 511,表示8进制的 0o777,即拥有者,用户组和其他用户均具有读、写和执行的权限。

例:

>>> import os
>>> r = os.mkdir('D:/test')  #  在D盘下创建一个test的目录
>>> print(r)

os.makedirs(name, mode=511, exist_ok=False)

递归地创建目录并设置访问权限,类似于linux中的 mkdir -p

权限跟上面一样

例:

>>> import os
>>> r = os.makedirs('D:/test/test')  #  在D盘下创建一个test的目录,然后在test目录再创建一个test目录
>>> print(r)

os.rmdir(path)

删除指定的目录,若目录非空及里面有文件,则抛出OSError异常。

>>> import os
>>> r = os.rmdir('D:/test')  #  删除D盘下的test目录
>>> print(r)

os.removedirs(path)

递归删除指定的目录。

若指定的是一个文件,则引发 NotADirectoryError 异常

若指定的目录不为空,则引发OSError异常。

例:

>>> import os
>>> r = os.removedirs('D:/test/test')  #  递归删除在D盘下的两个test目录
>>> print(r)

os.remove(path)

删除指定的文件。若 path 为一个目录,则引 PermissionError 异常

例:

>>> import os
>>> r = os.remove('D:/test.txt')  #  删除在D盘下的test.txt文件
>>> print(r)

os.rename(src, dst)

重命名文件或目录,如果dst是一个存在的目录, 将抛出OSError。

src – 要修改的目录名

dst – 修改后的目录名

例:

>>> import os
>>> r = os.rename('D:/test','D:/test2')  #  将D盘下的test目录重命名为test2
>>> print(r)

os.chown(path, uid, gid)

用于更改文件所有者,如果不修改可以设置为 -1

path – 设置权限的文件路径

uid – 所属用户 ID

gid – 所属用户组 ID

例如:

>>> import os
>>> r = os.chown('test.txt',0,0) # 设置文件的UID为0,root用户,GID为0,root组
>>> print(r)

os.system(“bash command”)

运行shell命令,直接显示

例如:

>>> import os
>>> r = os.system('dir')  # 执行 dir 命令 
>>> print(r)

os.chmod(path, mode)

用于更改文件或目录的权限

mode 参数有如下:

选项 说明
stat.S_IXOTH 其他用户有执行权 0o001
stat.S_IWOTH 其他用户有写权限 0o002
stat.S_IROTH 其他用户有读权限 0o004
stat.S_IRWXO 其他用户有全部权限(权限掩码) 0o007
stat.S_IXGRP 组用户有执行权限 0o010
stat.S_IWGRP 组用户有写权限 0o020
stat.S_IRGRP 组用户有读权限 0o040
stat.S_IRWXG 组用户有全部权限(权限掩码) 0o070
stat.S_IXUSR 拥有者具有执行权限 0o100
stat.S_IWUSR 拥有者具有写权限 0o200
stat.S_IRUSR 拥有者具有读权限 0o400
stat.S_IRWXU 拥有者有全部权限(权限掩码) 0o700
stat.S_ISVTX 目录里文件目录只有拥有者才可删除更改 0o1000
stat.S_ISGID 执行此文件其进程有效组为文件所在组 0o2000
stat.S_ISUID 执行此文件其进程有效用户为文件所有者 0o4000
stat.S_IREAD windows下设为只读
stat.S_IWRITE windows下取消只读

例如:

>>> import os
>>> r = chmod("D:/test.txt", stat.S_IWOTH)  # 设置文件可以被其他用户写入
>>> print(r)

os 模块就写这么多吧!


sys模块:

之前也有提到这个模块

sys.argv 接收命令行参数,生成一个List,第一个元素是程序本身路径

例如:

>>> test.py https://www.baidu.com/ 
>>> import sys
>>> r = sys.argv[0]  # 获取脚本名
>>> print(r)  # 输出 test
>>> r2 = sys.argv[1]  # 获取第一个参数
>>> print(r2)  # 输出 https://www.baidu.com/

shell:

python执行shell命令有几个方法

1. os.system()

前面有提到过这种方法。

语法: os.system(“command”)

例如:

>>> import os
>>> r = os.system('dir')  # 执行 dir 命令 
>>> print(r)

2. os.popen(command,mode)

通过 os.popen() 返回的是 file read 的对象,

对其进行读取 read() 的操作可以看到执行的输出。但是无法读取程序执行的返回值

例如:

>>> import os
>>> r = os.popen('dir')  # 执行 dir 命令 
>>> print(r.read())

需要使用 read() 方法


3. subprocess 模块

使用 subprocess 模块的 getoutput 方法,

主要方法:

subprocess.getstatusoutput(cmd) 返回(status, output)

subprocess.getoutput(cmd) 只返回输出结果

subprocess.getstatus(file) 返回ls -ld file的执行结果字符串,调用了getoutput,不建议使用此方

例如:

>>> import subprocess
>>> r = subprocess.getstatusoutput('dir')  # 执行 dir 命令 
>>> print(r)
>>> (0, '-rw-r--r-- 1 long long 6030829 Jan 5 21:34 log') 

总结:

模块第二篇!!