python学习之路——基础篇(3)模块(续)

re正则表达式、shutil、ConfigParser、xml

一、re

  • 正则元字符和语法:
语法 说明   表达式 完全匹配字符
          字符
一般字符   匹配自身 abc   abc
. 匹配除换行符“\n”外,任意一个字符 a.c abc
\       转义字符,将特殊字符转义为本身
a\.c

a\\c


a.c

a\c

[...]
匹配字符集任意一个字符,或者“-”表示一个集合范围

如:[a-zA-Z0-9]匹配范围中任意一个字符;或者[^]

匹配否定,对括号中的内容取反。

[abc]efg
aefg

befg

cefg

         预定义字符集
\d 数字:[0-9] a\dc a1c
\D 非数字:[^\d] a\Dc abc
\s 空白字符:[<空格>\t\r\n\f\v] a\sc a c
\S 非空白字符:[^\s] a\Sc abc
\w 字符:[a-zA-Z0-9_]   a\wc abc
\W  非单词字符:[^\w] a\Wc a c
                           数量词
*   匹配前一个字符0次或无数次 a*b
aab

ab

b

+   匹配前一个字符1次或无数次 a+b
aab

aaaab

? 匹配前一个字符0次或1次 a?b
b

ab

{m} 匹配前一个字符m次 a{2}c aac
{m,n}
匹配前一个字符m次到n次。m与n可以省略

如果省略m,表示0次到n次;省略n表示从m次到

无数次

a{1,2}c
ac

aac


*? +? ??

{m,n}?

使*、+、?、{m,n}变为非贪婪模式 见后文
                    边界匹配
^ 匹配字符串开头 ^abc abc
$ 匹配字符串结尾 abc$ abc
\A 仅匹配字符串开头 \Aabc abc
\Z 仅匹配字符串结尾 abc\Z abc
\b
匹配一个单词边界,也就是指单词和空格间的位置。例如,“er\b”可以匹配“never”中的“er”,但不能匹配“verb”中的“er”
ab\b ab
\B
匹配非单词边界。“er\B”能匹配“verb”中的“er”,但不能匹配“never”中的“er”
ab\Bc abc
                    逻辑与分组
|
代表左右表达式任意匹配一个。

它总是先匹配左边的,一旦匹配成功,则跳过右边表达式。

如果|没有被包含在()中,他的范围将是整个表达式。

abc|def
abc

def

()
被括号括起来的表达式将视为分组。

从表达式左边开始,每遇到一个分组的左括号“(“,编号+1

分组表达式作为一个整体,可以后接数量词。表达式中|仅在分组中生效。


(abc){2}

(abc|bcd)


abcabc

abc

(?P<name>...) 分组,除了原有编号外,再指定一个别名。group(1)=group(name) (?P<id>abc) abc
(?P=name)引用别名为name的分组匹配到的字符串(?P<id>123)abc(?P=id)123abc123
  • 数量词的贪婪模式与非贪婪模式

  正则表达式通常用于在文本中查找匹配的字符串。Python里数量词默认是贪婪的(在少数语言里也可能是默认非贪婪),总是尝试匹配尽可能多的字符;非贪婪的则相反,总是尝试匹配尽可能少的字符。例如:正则表达式"ab*"如果用于查找"abbbc",将找到"abbb"。而如果使用非贪婪的数量词"ab*?",将找到"a"。

  • 反斜杠的困扰

  与大多数编程语言相同,正则表达式里使用"\"作为转义字符,这就可能造成反斜杠困扰。假如你需要匹配文本中的字符"\",那么使用编程语言表示的正则表达式里将需要4个反斜杠"\\\\":前两个和后两个分别用于在编程语言里转义成反斜杠,转换成两个反斜杠后再在正则表达式里转义成一个反斜杠。Python里的原生字符串很好地解决了这个问题,这个例子中的正则表达式可以使用r"\\"表示。同样,匹配一个数字的"\\d"可以写成r"\d"。有了原生字符串,你再也不用担心是不是漏写了反斜杠,写出来的表达式也更直观。

  • re相关匹配方法
  1. match

    match,从起始位置开始匹配,匹配成功返回一个对象,未匹配成功返回None

    

 1 import re
 2
 3 text="the Attila the Hun show"
 4 m = re.match(".",text)
 5 print(m.group()) #"t" 或者group(0)取得匹配所有结果
 6
 7 m = re.match("(.)(.)(.)",text)
 8 print(m.group(0)) #"the"
 9
10 #分组
11 print(m.group(1,2,3)) #(‘t‘,‘h‘,‘e‘) 匹配后得分组
12
13 #将正则编译成Pattern对象
14 pattern = re.compile(".")
15 m = pattern.match(text)
16 print(m.group()) #‘t‘

  2. search

    search, 浏览整个字符串去匹配第一个,未匹配成功返回None

1 import re
2 text = "Example 3:there is 1 date 11/5/2016 in here"
3 m = re.search("(\d{1,2})/(\d{1,2})/(\d{2,4})",text)
4 print(m.group(1),m.group(2),m.group(3))# 11 5 2016

3. sub

    替换匹配成功的指定位置字符串

 1 import re
 2 # sub(pattern, repl, string, count=0, flags=0)
 3 # pattern: 正则模型
 4 # repl   : 要替换的字符串或可执行对象
 5 # string : 要匹配的字符串
 6 # count  : 指定匹配个数
 7 # flags  : 匹配模式
 8 text = "you‘re no fun anymore fun"
 9 m = re.sub("fun","entertaining",text,2)
10 print(m)
11 # "you‘re no entertaining anymore entertaining"

4. spilt

          根据正则匹配分隔字符串

import re
# split(pattern, string, maxsplit=0, flags=0)
# pattern: 正则模型
# string : 要匹配的字符串
# maxsplit:指定分割个数
# flags  : 匹配模式

# 无分组
origin = "hello alex bcd alex lge alex acd 19"
r = re.split("alex", origin, 1)
print(r) #["hello","bcd alex lge alex acd 19"]

# 有分组
origin = "hello alex bcd alex lge alex acd 19"
r1 = re.split("(alex)", origin, 1)
print(r1) # ["hello","alex","bcd alex lge alex acd 19"]

 r2 = re.split("(al(ex))", origin, 1)
print(r2) # ["hello","alex","ex","bcd alex lge alex acd 19"]

5. findall

    获取非重复的匹配列表;如果有一个组则以列表形式返回,且每一个匹配均是字符串;如果模型中有多个组,则以列表形式返回,且每一个匹配均是元祖;

    空的匹配也会包含在结果中

1 # 无分组
2 origin = "hello alex bcd abcd lge acd 19"
3 r = re.findall("a\w+",origin)
4 print(r) # ["alex","abcd","acd"]
5
6 # 有分组
7 origin = "hello alex bcd abcd lge acd 19"
8 r = re.findall("a((\w*)c)(d)", origin)
9 print(r) # 匹配两个字符串"abcd"&"acd"先将匹配最外层分组的元素放入元祖#中,再将内层分组匹配的元素放入元祖中结果[("bc","b","d"),("c","","d")] 
IP:
^(25[0-5]|2[0-4]\d|[0-1]?\d?\d)(\.(25[0-5]|2[0-4]\d|[0-1]?\d?\d)){3}$
手机号:
^1[3|4|5|8][0-9]\d{8}$
邮箱:
[a-zA-Z0-9_-][email protected][a-zA-Z0-9_-]+(\.[a-zA-Z0-9_-]+)+

二、shutil

高级文件、文件夹、压缩包处理模块

  1. 将文件内容拷贝到另一个文件

    shutil.copyfileobj(fsrc, fdst[, length])

1 import shutil
2 shutil.copyfileobj(open(‘old.xml‘,‘r‘), open(‘new.xml‘, ‘w‘))

  2. 拷贝文件

    shutil.copyfile(src, dst)

1 shutil.copyfile(‘f1.log‘, ‘f2.log‘)

  3. 仅拷贝权限。内容、组、用户均不变

    shutil.copymode(src, dst)

1 shutil.copymode(‘f1.log‘, ‘f2.log‘)

  4. 仅拷贝状态的信息,包括:mode bits, atime, mtime, flags

    shutil.copystat(src, dst)

1 shutil.copystat(‘f1.log‘, ‘f2.log‘)

  5. 拷贝文件和权限

    shutil.copy(src, dst)

1 shutil.copy(‘f1.log‘, ‘f2.log‘)

  6. 拷贝文件和状态信息

    shutil.copy2(src, dst)

1 shutil.copy2(‘f1.log‘, ‘f2.log‘)

  7. 递归的去拷贝文件夹

    shutil.ignore_patterns(*patterns) 忽略某些格式文件
    shutil.copytree(src, dst, symlinks=False, ignore=None)

1 import shutil
2 shutil.copytree(‘folder1‘, ‘folder2‘, ignore=shutil.ignore_patterns(‘*.pyc‘, ‘tmp*‘))
1 import shutil
2 shutil.copytree(‘f1‘, ‘f2‘, symlinks=True, ignore=shutil.ignore_patterns(‘*.pyc‘, ‘tmp*‘))

 8. 递归的去删除文件

    shutil.rmtree(path[, ignore_errors[, onerror]])

1 import shutil
2 shutil.rmtree(‘folder1‘)

  9. 递归的去移动文件,它类似mv命令,其实就是重命名。

    shutil.move(src, dst)

1 import shutil
2 shutil.move(‘folder1‘, ‘folder3‘)

  10. 创建压缩包并返回文件路径,例如:zip、tar

    shutil.make_archive(base_name, format,...) 这个功能只能压缩一个文件夹

  • base_name: 压缩包的文件名,也可以是压缩包的路径。只是文件名时,则保存至当前目录,否则保存至指定路径,如:www =>保存至当前路径如:/Users/lcy/www =>保存至/Users/lcy/
  • format: 压缩包种类,“zip”, “tar”, “bztar”,“gztar”
  • root_dir: 要压缩的文件夹路径(默认当前目录)
  • owner: 用户,默认当前用户
  • group: 组,默认当前组
  • logger: 用于记录日志,通常是logging.Logger对象
#将 /Users/lcy/Downloads/test 下的文件打包放置当前程序目录
import shutil
ret = shutil.make_archive("www", ‘gztar‘, root_dir=‘/Users/lcy/Downloads/test‘)
#将 /Users/lcy/Downloads/test 下的文件打包放置 /Users/lcy/目录
import shutil
ret = shutil.make_archive("/Users/lcy/www", ‘gztar‘, root_dir=‘/Users/lcy/Downloads/test‘)

附加:ZipFile 和 TarFile一般用这个较多

 1 import zipfile
 2
 3 # 压缩
 4 z = zipfile.ZipFile(‘laxi.zip‘, ‘w‘) #创建一个压缩包
 5 z.write(‘a.log‘)
 6 z.write(‘data.data‘)
 7 z.close()
 8 # 解压
 9 z = zipfile.ZipFile(‘laxi.zip‘, ‘r‘)
10 z.extractall()
11 z.close()
时间: 2024-10-19 18:56:21

python学习之路——基础篇(3)模块(续)的相关文章

python学习之路基础篇(第四篇)

一.课程内容回顾 1.python基础 2.基本数据类型  (str|list|dict|tuple) 3.将字符串“老男人”转换成utf-8 s = "老男人" ret = bytes(s,encoding="utf-8") print(ret) ret1 = bytes(s,encoding="gbk") print(ret1) #程序运行结果如下: b'\xe8\x80\x81\xe7\x94\xb7\xe4\xba\xba' b'\xc0

python学习之路基础篇(第七篇)

一.模块 configparser XML shutil zipfile 和 tarfile subprocess 二.面向对象 什么是面向对象 self是什么鬼 构造方法 面向对象的三大特性:封装,继承,多态 已经学习过的python内置类:str  list  tuple dict  set python自定义类 python单继承 python多继承

python学习之路基础篇(第五篇)

前四天课程回顾 1.python简介 2.python基本数据类型 类: int:整型 | str:字符串 | list:列表 |tuple:元组 |dict:字典 | set:集合 对象: li = [11,22,33] #列表的一个对象 s = "MoHan" #字符串的一个对象 3.函数式编程 4.装饰器 @装饰器函数名 def func(): pass 其中@装饰器函数名,程序执行到此,会进行如下三步操作: 1.将func当做参数进行传递给装饰器函数并执行 2.将装饰器函数的返

python学习之路基础篇(三)

一.简单回顾上次课程内容 主要内容:str|list|dict 类---对象 具体内容可以参考: http://www.cnblogs.com/wupeiqi/articles/5433925.htmlhttp://www.cnblogs.com/wupeiqi/articles/5444685.html 二.python后续学习方法:首先整理课程讲解内容到博客,然后再写作业 三.本次课程内容 1.数据类型-set 小结: 列表和集合set的区别(小知识点):列表:有序 可重复 可嵌套集合set

Python学习之路基础篇--03Python基础+万恶的运算符

1 格式化输出% 用%s(用来表示str数据类型) 和 %d (用来表示int数据类型),如果要用%号的话,就要使用两个%%,这样即可输出. 2 初识编码 电脑的传输数据,储存都是用的 01010101 的方式 1 byte = 8 bit (即 1 字节 = 8 位) 1 KB = 1024 byte 1MB = 1024 KB 1 GB = 1024 MB 1 TB = 1024 GB ASCii码:一开始由美国人发明, 一共1 个字节, 8 位, 最初7 位即可,故最左边的一位为 0 un

Python学习之路基础篇--09Python基础,初识函数

函数可以分为内置函数 和 自定义函数.这次关注的主要是自定义函数.定义函数之后,就可以在任何需要它的地方调用. 1 返回值的重要性 返回值的3种情况 没有返回值 ---- 返回None 不定 return 只写 return :结束一个函数 return None ---- 不常用 只有一个返回值 可以返回任何数据类型 只要返回就可以接收到 如果一个函数中有多个return ,那么只执行第一个 返回多个值 用多个变量接收:有多少个返回值就用多少个变量接收 用一个变量接收:得到一个元组 2 参数

Python学习总结之一 -- 基础篇

Python学习第一篇 一:写在前面 啊,最近我的新博客一直都没有更新学习内容了,只是最近一直都在忙着寻找实习机会(或许这只是一个借口,真实原因是我太懒惰了,改改改!).终于今天又投递了几个新的实习职位之后幡然醒悟,我的执行力还是太弱了,我得更加有自律性更加坚持才行.所以今天,我把之前学习的Python基础知识总结一下. 二:认识Python 首先我们得清楚这个:Python这个名字是从Monty Python借鉴过来的,而不是源于大家所知道的大蟒蛇的意思.我们为什么要学习Python呢?就我而

Python学习之旅 —— 基础篇(六)模

本篇要点: 模块   一.模块 模块是实现某个功能的代码集合 函数式编程则完成一个功能,其他代码用来调用即可,提供了代码的重用性和代码间的耦合.而对于一个复杂的功能来,可能需要多个函数才能完成(函数又可以在不同的.py文件中),n个 .py 文件组成的代码集合就称为模块.   模块的种类 模块分为三种:     内置标准模块(标准库)     第三方模块(开源模块)     自定义模块   1.自动以模块 & 导入模块 使用模块前需要先将模块导入,模块导入的方式: # 单模块,且在同一目录下,建

Python学习之旅 —— 基础篇(五)字符串格式化、递归、生成器&amp;迭代器、模块

本篇要点:字符串格式化递归生成器和迭代器模块 一.字符串格式化 字符串格式化的两种方式:占位符 %, format函数1.占位符% %[(name)][flags][width].[precision]typecode - (name) 可选,用于选择指定的key - flags 可选,可供选择的值有: - + 右对齐:正数前加正好,负数前加负号: - - 左对齐:正数前无符号,负数前加负号: - 空格 右对齐:正数前加空格,负数前加负号: - 0 右对齐:正数前无符号,负数前加负号:用0填充空