re模块
正则表达式符号:
表达符号 | 说明 |
---|---|
. | 匹配所有字符串,除\n以外 |
- | 表示范围[0-9] |
* | 1.匹配前面的子表达式零次或多次,匹配前面的字符0次或多次 2.re.findall(“ab*”,“cabc3abcbbac”)结果:[‘ab’, ‘ab’, ‘a’] |
+ | 匹配前面的子表达式一次或多次 |
^ | 匹配字符串开头 |
$ | 匹配字符串结尾 |
\ | 转义字符,可以将其他有特殊意义的字符串以原本意思表示,要匹配字符,请使用 |
? | 匹配前一个字符串0次或1次 re.findall(‘ab?’,‘abcabcabcadf’)结果[‘ab’, ‘ab’, ‘ab’, ‘a’] |
匹配前一个字符m次 re.findall(‘cb{1}’,‘bchbchcbfbcbb’)结果[‘cb’, ‘cb’] |
|
匹配前一个字符n到m次 re.findall(‘cb{2,3}’,‘bchbchcbfbcbb’)结果[‘cbb’] |
|
\d | 匹配数字,等于[0-9] re.findall(‘\d’,‘电话:10086’)结果[‘1’, ‘0’, ‘0’, ‘8’, ‘6’] |
\D | 匹配非数字,等于[^0-9] re.findall(‘\D’,‘电话:10086’)结果[‘电’, ‘话’, ‘:’] |
\w | 匹配字母和数字,等于[A-Za-z0-9] re.findall(‘\w’,‘alex123,./;;;’)结果[‘a’, ‘l’, ‘e’, ‘x’, ‘1’, ‘2’, ‘3’] |
\W | 匹配非英文字母和数字,等于[^A-Za-z0-9] re.findall(‘\W’,‘alex123,./;;;’)结果[‘,’, ‘.’, ‘/’, ‘;’, ‘;’, ‘;’] |
\s | 匹配空白字符 re.findall(‘\s’,‘3*ds \t\n’)结果[’ ', ‘\t’, ‘\n’] |
\S | 匹配非空白字符 re.findall(‘\s’,‘3ds \t\n’)结果[‘3’, '’, ‘d’, ‘s’] |
\A | 匹配字符串开头 |
\Z | 匹配字符串结尾 |
\b | 匹配单词的词首和词尾,单词被定义为一个字母数字序列,因此词尾是用空白符或非字母数字符来表示的 |
\B | 与\b相反,只在当前位置不在单词边界时匹配 |
[] | 是定义匹配的字符范围。比如 [a-zA-Z0-9] 表示相应位置的字符要匹配英文字符和数字。[\s]表示空格或者号。 |
正则表达式注意事项
-
字符集
作用:使用中括号来括住字符串来创建字符集,字符集可匹配他包括的任意字串
1)‘[pj]ython’ 只能够匹配‘python’ ‘jython’
2) ‘[a-z]’ 能够(按字母顺序)匹配a-z任意一个字符
3)‘[a-zA-Z0-9]’ 能匹配任意一个大小写字母和数字
4)‘[^abc]’ 可以匹配任意除a,b和c 之外的字符串 -
可选项和重复子模式
作用:在子模式后面加上问号,它就变成可选项,出现或者不出现在匹配字符串中都是合法的,例如:r’(aa)?(bb)?ccddee’ 只能匹配下面几种情况;
‘aabbccddee’ ‘aaccddee’ ‘bbccddee’ ‘ccddee’
-
字符串的开始和结尾
1) ‘w+’ 匹配以w开通的字符串
2) ‘[1](https://so.csdn.net/so/search?q=http&spm=1001.2101.3001.7020)’ 匹配以’http’ 开头的字符串
3)‘ $com’ 匹配以‘com’结尾的字符串
常用函数
函数 | 作用 |
---|---|
re.compile(pattern[, flags]) | 根据正则表达式字符串创建模式对象 |
re.search(pattern, string[, flags]) | 扫描整个字符串并返回第一个成功的匹配 |
re.match(pattern, string[, flags]) | 从字符串的起始位置匹配,如果起始位置匹配不成功的话,match()就返回none |
re.findall(pattern, string) | 找到RE匹配的所有字符串,并把他们作为一个列表返回 |
re.split(pattern, string[, maxsplit=0]) | split能够按照所能匹配的字串将字符串进行切分,返回切分后的字符串列表 |
re.finditer(pattern, string, flags=0) | 找到RE匹配的所有字符串,并把他们作为一个迭代器返回 |
re.sub(pattern, repl, string, count=0, flags=0) | 替换匹配到的字符串 |
re.escape(string) | 如果字符串中包含了正则表达式的特殊字符,那么就需要使用re.escape函数来对这些特殊字符进行转义,以保证匹配的准确性 |
-
re.compile(pattern[, flags])
1)把一个正则表达式pattern编译成正则对象,以便可以用正则对象的match和search方法
2)用了re.compile以后,正则对象会得到保留,这样在需要多次运用这个正则对象的时候,效率会有较大的提升import re trace_message = "<idle>-0 (-----) [004] .... 2628922.673375: cpu_idle: state=0 cpu_id=4" cpu_re = re.compile(r'^(.*?)\s+\((.*?)\)\s+\[(.*?)\]\s+\.\.\.\.\s(.*?):\s+(.*?)$') ret = re.match(cpu_re,log_message) print(ret) # <re.Match object; span=(0, 74), match='<idle>-0 (-----) [004] .... 2628922.673375: c> match='cpu_idle'
-
search(pattern, string[, flags]) 和 match(pattern, string[, flags])
1)match :只从字符串的开始与正则表达式匹配,匹配成功返回matchobject,否则返回none;
2)search :将字符串的所有字串尝试与正则表达式匹配,如果所有的字串都没有匹配成功,返回none,否则返回matchobject;match与search使用比较代码实例:
import re a =re.match('.android.camera', '.android.camera-10011 (10011) [007] .... 105371.125644: tracing_mark_write: S|10011|deliverInputEvent|662016339') b = re.match('deliverInputEvent', '.android.camera-10011 (10011) [007] .... 105371.125644: tracing_mark_write: S|10011|deliverInputEvent|662016339') print(a.group()) # .android.camera print(b) # None # 无论有多少个匹配的只会匹配一个 c = re.search('camera', '<...>-2994 ( 1347) [002] .... 105367.330952: tracing_mark_write: B|1347|startActivity com.android.camera/.CameraActivity') print(c) # <re.Match object; span=(99, 105), match='camera'> match='camera' print(c.group()) # camera
-
split(pattern, string[, maxsplit=0])
作用:将字符串以指定分割方式,格式化成列表
代码实例:
import re text = 'xx 0xdd###ccTv-1' print(re.split('\W+', text)) print(re.split('\W', text)) print(re.split('\d', text)) print(re.split('#', text)) print(re.split('#+', text))
-
findall(pattern, string)
作用:正则表达式 re.findall 方法能够以列表的形式返回能匹配的子串
import re pattern = r'^(.*?)\s+\((.*?)\)\s+\[(.*?)\]\s+\.\.\.\.\s(.*?):\s+(.*?)$' trace_str = "<idle>-0 (-----) [004] .... 2628922.673375: cpu_idle: state=0 cpu_id=4" match = re.findall(pattern, trace_str) print(match) # 输出结果:[('<idle>-0', '-----', '004', '2628922.673375', 'cpu_idle: state=0 cpu_id=4')]
-
sub(pat, repl, string[, count=0])
1)替换,将string里匹配pattern的部分,用repl替换掉,最多替换count次然后返回替换后的字符串
2)如果string里没有可以匹配pattern的串,将被原封不动地返回
3)repl可以是一个字符串,也可以是一个函数
4) 如果repl是个字符串,则其中的反斜杆会被处理过,比如 \n 会被转成换行符,反斜杆加数字会被替换成相应的组,比如 \6 表示pattern匹配到的第6个组的内容
OS模块
import os
#1.获取当前文件路径
print(os.getcwd())
#2 可生成多层递归目录
os.makedirs(r'C:\data\local') # 可以发现在C盘创建了文件夹\data\local
#3 若目录为空,则删除,并递归到上一级目录,如若也为空,则删除,依此类推
os.removedirs(r'C:\data\local') # 删除所有空目录
#4 生成单级目录;相当于shell中mkdir dirname
os.mkdir(r'C:\data') # 仅能创建单个目录
#5 删除空目录(删除非空目录, 使用shutil.rmtree())
os.rmdir(r'C:\data') # 仅删除指定的一个空目录
#6 列出指定目录下的所有文件和子目录,包括隐藏文件,并以列表方式打印
print(os.listdir(r'C:\vendor\etc\camera'))
#7 删除一个文件
os.remove(r'C:\vendor\etc\camera\camxoverridesettings.txt') # camxoverridesettings.txt文件
#8 重命名文件/目录
os.rename(r'C:\vendor\etc\camera\cameracamxoverridesettings.txt',r'C:\vendor\camx\src\core\camxsettings.xml')
#9 获取文件/目录信息
print(os.stat(r'C:\vendor\etc\camera\camxoverridesettings.txt'))
#10 输出操作系统特定的路径分隔符,win下为"\\",Linux下为"/"
print(os.sep) # \
#11 输出当前平台使用的行终止符,win下为"\r\n",Linux下为"\n"
print(os.linesep)
#12 输出用于分割文件路径的字符串
print(os.pathsep) # ; (分号)
#13 输出字符串指示当前使用平台。win->'nt'; Linux->'posix'
print(os.name) # nt
#14 运行shell命令,直接显示
os.system("bash command")
#15 获取系统环境变量
print(os.environ)
#16 返回path规范化的绝对路径
print(os.path.abspath(r'C:\vendor\etc\camera\camxoverridesettings.txt')) # C:\vendor\etc\camera\camxoverridesettings.txt
#17 将path分割成目录和文件名二元组返回
print(os.path.split(r'C:\vendor\etc\camera')) # ('C:\\vendor\\etc', 'camera')
#18 返回path的目录。其实就是os.path.split(path)的第一个元素
print(os.path.dirname(r'C:\vendor\etc\camera')) # C:\vendor\etc
#19 返回文件路径的文件名部分,如何path以/或\结尾,那么就会返回空值。即os.path.split(path)的第二个元素
print(os.path.basename(r'C:\vendor\etc\camera')) # camera
#20 如果path存在,返回True;如果path不存在,返回False
print(os.path.exists(r'C:\vendor\etc\camera')) # True
#21 如果path是绝对路径,返回True # True
print(os.path.isabs(r"C:\vendor\etc\camera"))
#22 如果path是一个存在的文件,返回True。否则返回False
print(os.path.isfile(r'C:\vendor\etc\camera\camxoverridesettings.txt')) # True
#23 如果path是一个存在的目录,则返回True。否则返回False
print(os.path.isdir(r'C:\vendor\etc\camera')) # True
#24 返回path所指向的文件或者目录的最后访问时间,浮点型
print(os.path.getatime(r'C:\vendor\etc\camera\camxoverridesettings.txt'))
#25 返回path所指向的文件或者目录的最后修改时间,浮点型
print(os.path.getmtime(r'C:\vendor\etc\camera\camxoverridesettings.txt'))
shutil模块
python的shutil模块可以看做是OS模块的补充,shutil模块用于文件和目录的高级处理,提供了支持文件赋值,移动,删除,压缩和解压缩等功能
复制文件
shutil模块的主要作用是复制文件,实现方式如下:
-
shutil.copyfileobj(file1,file2)覆盖复制
将file1的内容覆盖file2,file1、file2表示打开的文件对象。
file1=open('cpu0.py','r') #打开源文件 file2=open('cpu1.py','w') #打开目标文件 shutil.copyfileobj(file1,file2) #文件复制,注意没有返回值
-
shutil.copyfile(file1,file2)覆盖复制
也是覆盖,但是无须打开文件,直接用文件名进行覆盖(其源码还是调用的copyfileobj)
>>> shutil.copyfile('../cpu0.py','./cpu1.py') #用copyfile复制文件 >>> shutil.copyfile('../cpu0.py','./os/cpu1.py') #目标文件的目录不存在会报错 >>> shutil.copyfile('../cpu.py','./') #dst不是文件而是目录会报错
-
shutil.copymode(file1,file2)权限复制
仅复制文件权限,不更改文件内容、组和用户,无返回对象。
>>> os.system('chmod 777 ../cpu.py') #用shell指令将源文件的读写属性改变 >>> os.system('ls -l ../cpu.py') #打印源文件的属性为-rwxrwxrwx >>> shutil.copyfile('../cpu.py','./cpu4.py') #用copyfile来复制文件 >>> os.system('ls -l ./cpu4.py') #打印目标文件属性为-rw-r--r--,和源文件不一样 >>> shutil.copymode('../cpu.py','./cpu4.py')#用copymode来复制文件权限 >>> os.system('ls -l ./cpu4.py') #打印目标文件属性为-rwxrwxrwx,和源文件一样
-
shutil.copystart(file1,file2)状态复制
复制文件的所有状态信息,包括权限、组、用户和时间等,无返回对象。
>>> shutil.copyfile('../cpu.py','./cpu5.py') #复制文件 >>> os.system('ls -l ../cpu.py') #打印源文件信息 >>> os.system('ls -l ./cpu5.py') #打印目标文件信息,权限和时间和源文件不一样 >>> shutil.copystat('../cpu.py','./cpu5.py') #复制文件stat到目标文件 >>> os.system('ls -l ./cpu5.py') #打印目标文件信息,权限和时间和源文件一样
-
shutil.copy(file1,file2)内容和权限复制
复制文件的内容和权限,相当于先执行了copyfile再执行了copysmode。
>>> shutil.copy('../cpu.py','./') #复制文件到当前目录,注意dst为目标路径 >>> os.listdir('./') #列出当前目录的文件名信息,cpu.py已创建 >>> shutil.copy('../cpu.py','./cpu2.py') #复制文件并重命名,注意dst为文件名 >>> os.listdir('./') #列出当前目录的文件名信息,cpu2.py已创建
-
shutil.copy2(file1,file2)内容和权限复制
复制文件的内容及所有状态信息,相当于先执行了copyfile再执行了copystart。
>>> shutil.copy('../cpu.py','./cpu2.py') #用copy来复制文件 >>> time.ctime(os.stat('../cpu.py').st_mtime) #返回源文件修改时间 >>> time.ctime(os.stat('./cpu2.py').st_mtime) #返回目标文件修改时间,和源文件不一样 >>> shutil.copy2('../cpu.py','./cpu3.py') #用copy2来复制文件 >>> time.ctime(os.stat('./cpu3.py').st_mtime) #返回目标文件修改时间,和源文件一样
-
shutil.copytree()递归复制
递归地复制文件内容及状态信息
>>> shutil.copytree('/kernel/os/cpu','/kernel/os/cpu1',ignore=None,copy_function=shutil.copy) >>> os.listdir('/kernel/os/cpu1') #列出copy后的文件夹中的文件 >>> shutil.copytree('/home/user/Python','/kernel/os/cpu2',ignore=shutil.ignore_patterns('*.py'),copy_function=shutil.copy2) '/kernel/os/cpu2' >>> os.listdir('/kernel/os/cpu2') #copy后的文件名没有"*py"结尾的文件
移动文件
使用函数shutil.move()函数可以递归地移动文件或重命名,并返回目标,若目标是现有目录则src再当前目录移动;若目标已经存在且不是目录,则可能会被覆盖。
>>> shutil.move('cpu0.py','cpu1.py') #移动文件
>>> shutil.move('./cpu0','./cpu1') #移动文件夹
-
读取压缩及归档压缩文件
使用函数shutil.make_archive()创建归档文件,并返回归档后的名称。
shutil.make_archive(base_name,format[,root_dir[,base_dir[,verbose[,dry_run[,owner[,group[,logger]]]]]]])
1)base_name为需要创建的文件名,包括路径
2)format表示压缩格式,可选zip、tar或bztar等
3)root_dir为归档的目录>>> os.listdir() ['cpu0', 'cpu1.py', 'cpu2.py'] >>> shutil.make_archive('./cpu0','zip','./') #压缩文件为zip格式 '/kernel/cpu0.zip'
Random 模块
函数 | 作用 |
---|---|
random.random() | 产生0-1的随机浮点数 |
random.uniform(a, b) | 产生指定范围内的随机浮点数 |
random.randint(a, b) | 产生指定范围内的随机整数 |
random.randrange([start], stop[, step]) | 从一个指定步长的集合中产生随机数 |
random.choice(sequence) | 从序列中产生一个随机数 |
random.shuffle(x[, random]) | 将一个列表中的元素打乱 |
random.sample(sequence, k) | 从序列中随机获取指定长度的片断 |
import random
#⒈ 随机整数:
print(random.randint(0,99)) # 随机选取0-99之间的整数
print(random.randrange(0, 101, 2)) # 随机选取0-101之间的偶数
#⒉ 随机浮点数:
print(random.random()) # 0.972654134347
print(random.uniform(1, 10)) # 4.14709813772
#⒊ 随机字符:
print(random.choice('abcdefg')) # c
print(random.sample('abcdefghij',3)) # ['j', 'f', 'c']
http ↩︎