python学习day5

一、模块

1.1定义

一个以.py结尾的python文件,用来从逻辑上组织python代码(变量,函数,类,逻辑)。

1.2导入模块

创建一个module1.py文件

  1. name = "chuck"
  2. def hello():
  3. print("hello chuck")
  4. ```
  5. 下面我想使用module1这个模块,就要导入这个模块,导入多个的模块时使用,分割
  6. ```py
  7. import module1
  8. module1.hello()
  9. chuck

导入一个模块多个方法使用from方式,多个方法使用,分割,导入所有方法使用*代表,但是不建议使用*,容易导致变量或者函数冲突

  1. from module1 import hello,hehe,o
  2. hello()
  3. hehe()
  4. o()
  5. chuck
  6. hehe
  7. o

使用as起一个别名的方法导入

  1. from module1 import hello
  2. from module1 import hehe as hehe2
  3. hello()
  4. hehe2()
  5. chuck
  6. hehe

1.3import的本质

  • import的本质就是将module1.py中所有代码解释一遍赋值给module1这个变量,import后,可以使用module1.hello()的方法使用
  • from方式的import是等于将module1的模块中hello的部分解释后赋值给hello变量,直接就可以使用hello()引用

1.4import和from的区别

需要导入的模块为module_template,其下面的方法为hello.
下面的导入方式,是反复的导入module_template,每导入一次等于在内存中读取一次module_template,重复的找module_template,所以这里就引入from的方式导入module_template

  1. import module_template
  2. def test1():
  3. module_template.hello()
  4. def test1():
  5. module_template.hello()
  6. def test1():
  7. module_template.hello()
  8. ```
  9. ```py
  10. from module_template import hello as hello2
  11. def test1():
  12. hello2()
  13. def test1():
  14. hello2()
  15. def test1():
  16. hello2()
  17. ```
  18. # 二、package的定义
  19. 本质是一个目录,区别是package带有一个__init__.py的文件,从逻辑上组织模块的
  20. ## 2.1导入package
  21. 导入package的本质就是在解释package里面的__init__.py文件内容并执行
  22. * 查看package1的包下__init__.py的文件内容
  23. ```py
  24. print("in package /init")

创建一个新文件,导入这个package

  1. import package1
  2. in package /init

导入package下package_module1.py下面的test方法
查看package_module1.py的内容

  1. def test():
  2. print("in the test1 ,test1 in package_module1,package_module1 in package1")

查看__init__.py内容

  1. from . import package_module1

查看module1下的内容,可以看出init文件为导入包提供了二次导入的方法

  1. import package1
  2. package1.package_module1.test()
  3. in the test1 ,test1 in package_module1,package_module1 in package1
  4. 由此看出,如果想导入package下面的模块,需要在init文件里导入当前package的模块即可

三、跨目录导入

前两章内容涉及的都是统计目录导入,不涉及跨目录导入,跨目录导入就涉及路径寻找了
例如,需要导入的模块为module_test1,首先会在当前路径下寻找module_test1.py,当前路径下找不到,再会去其他路径寻找,就会从sys.path中查找

  • 打印sys.path,实际就是一个列表
  1. >>> import sys
  2. >>> print(sys.path)
  3. ['', 'C:\\Users\\hexun\\AppData\\Local\\Programs\\Python\\Python35-32\\python35.
  4. zip', 'C:\\Users\\hexun\\AppData\\Local\\Programs\\Python\\Python35-32\\DLLs', '
  5. C:\\Users\\hexun\\AppData\\Local\\Programs\\Python\\Python35-32\\lib', 'C:\\User
  6. s\\hexun\\AppData\\Local\\Programs\\Python\\Python35-32', 'C:\\Users\\hexun\\App
  7. Data\\Local\\Programs\\Python\\Python35-32\\lib\\site-packages']
  8. >>>
  • 创建一个文件不在当前路径下的模块module2.py,如果此时导入会直接报错,是因为sys.path中没有module2所在目录
    ImportError: No module named ‘module2’
  • 使用os模块获取当前文件路径,进而获取父目录路径加入到sys.path中即可
  • 查看module2.py内容
  1. print("in the module2")
  • 在和module2.py非相同补录下导入module2,os.path.abspath(file)为当前文件的绝对路径,os.path.dirname为当前文件的目录名,sys.path.append()代表将获取到的路径追加到sys.path中
  1. import sys,os
  2. current_filename=os.path.abspath(__file__)
  3. print(current_filename)
  4. print(os.path.dirname(current_filename))
  5. BASE_DIR=os.path.dirname(current_filename)
  6. sys.path.append(BASE_DIR)
  7. import dir2.module2
  8. #结果如下:
  9. C:\python-HW\day4\modules\import_modules.py
  10. C:\python-HW\day4\modules
  11. in the module2

三、time&datetime模块

  1. #_*_coding:utf-8_*_
  2. __author__ = 'Alex Li'
  3. import time
  4. # print(time.clock()) #返回处理器时间,3.3开始已废弃 , 改成了time.process_time()测量处理器运算时间,不包括sleep时间,不稳定,mac上测不出来
  5. # print(time.altzone) #返回与utc时间的时间差,以秒计算\
  6. # print(time.asctime()) #返回时间格式"Fri Aug 19 11:14:16 2016",
  7. # print(time.localtime()) #返回本地时间 的struct time对象格式
  8. # print(time.gmtime(time.time()-800000)) #返回utc时间的struc时间对象格式
  9. # print(time.asctime(time.localtime())) #返回时间格式"Fri Aug 19 11:14:16 2016",
  10. #print(time.ctime()) #返回Fri Aug 19 12:38:29 2016 格式, 同上
  11. # 日期字符串 转成 时间戳
  12. # string_2_struct = time.strptime("2016/05/22","%Y/%m/%d") #将 日期字符串 转成 struct时间对象格式
  13. # print(string_2_struct)
  14. # #
  15. # struct_2_stamp = time.mktime(string_2_struct) #将struct时间对象转成时间戳
  16. # print(struct_2_stamp)
  17. #将时间戳转为字符串格式
  18. # print(time.gmtime(time.time()-86640)) #将utc时间戳转换成struct_time格式
  19. # print(time.strftime("%Y-%m-%d %H:%M:%S",time.gmtime()) ) #将utc struct_time格式转成指定的字符串格式
  20. #时间加减
  21. import datetime
  22. # print(datetime.datetime.now()) #返回 2016-08-19 12:47:03.941925
  23. #print(datetime.date.fromtimestamp(time.time()) ) # 时间戳直接转成日期格式 2016-08-19
  24. # print(datetime.datetime.now() )
  25. # print(datetime.datetime.now() + datetime.timedelta(3)) #当前时间+3天
  26. # print(datetime.datetime.now() + datetime.timedelta(-3)) #当前时间-3天
  27. # print(datetime.datetime.now() + datetime.timedelta(hours=3)) #当前时间+3小时
  28. # print(datetime.datetime.now() + datetime.timedelta(minutes=30)) #当前时间+30分
  29. #
  30. # c_time = datetime.datetime.now()
  31. # print(c_time.replace(minute=3,hour=2)) #时间替换

格式参照

  1. %a 本地(locale)简化星期名称
  2. %A 本地完整星期名称
  3. %b 本地简化月份名称
  4. %B 本地完整月份名称
  5. %c 本地相应的日期和时间表示
  6. %d 一个月中的第几天(01 - 31
  7. %H 一天中的第几个小时(24小时制,00 - 23
  8. %I 第几个小时(12小时制,01 - 12
  9. %j 一年中的第几天(001 - 366
  10. %m 月份(01 - 12
  11. %M 分钟数(00 - 59
  12. %p 本地am或者pm的相应符
  13. %S 秒(01 - 61
  14. %U 一年中的星期数。(00 - 53星期天是一个星期的开始。)第一个星期天之前的所有天数都放在第0周。
  15. %w 一个星期中的第几天(0 - 60是星期天)
  16. %W 和%U基本相同,不同的是%W以星期一为一个星期的开始。
  17. %x 本地相应日期
  18. %X 本地相应时间
  19. %y 去掉世纪的年份(00 - 99
  20. %Y 完整的年份
  21. %Z 时区的名字(如果不存在为空字符)
  22. %% ‘%’字符

时间关系转换

四、random模块

随机数

  1. mport random
  2. print random.random()
  3. print random.randint(1,2)
  4. print random.randrange(1,10)

生成随机验证码

  1. import random
  2. checkcode = ''
  3. for i in range(4):
  4. current = random.randrange(0,4)
  5. if current != i:
  6. temp = chr(random.randint(65,90))
  7. else:
  8. temp = random.randint(0,9)
  9. checkcode += str(temp)
  10. print checkcode

五、os模块

  1. os.getcwd() 获取当前工作目录,即当前python脚本工作的目录路径
  2. os.chdir("dirname") 改变当前脚本工作目录;相当于shellcd
  3. os.curdir 返回当前目录: ('.')
  4. os.pardir 获取当前目录的父目录字符串名:('..')
  5. os.makedirs('dirname1/dirname2') 可生成多层递归目录
  6. os.removedirs('dirname1') 若目录为空,则删除,并递归到上一级目录,如若也为空,则删除,依此类推
  7. os.mkdir('dirname') 生成单级目录;相当于shellmkdir dirname
  8. os.rmdir('dirname') 删除单级空目录,若目录不为空则无法删除,报错;相当于shellrmdir dirname
  9. os.listdir('dirname') 列出指定目录下的所有文件和子目录,包括隐藏文件,并以列表方式打印
  10. os.remove() 删除一个文件
  11. os.rename("oldname","newname") 重命名文件/目录
  12. os.stat('path/filename') 获取文件/目录信息
  13. os.sep 输出操作系统特定的路径分隔符,win下为"\\",Linux下为"/"
  14. os.linesep 输出当前平台使用的行终止符,win下为"\t\n",Linux下为"\n"
  15. os.pathsep 输出用于分割文件路径的字符串
  16. os.name 输出字符串指示当前使用平台。win->'nt'; Linux->'posix'
  17. os.system("bash command") 运行shell命令,直接显示
  18. os.environ 获取系统环境变量
  19. os.path.abspath(path) 返回path规范化的绝对路径
  20. os.path.split(path) path分割成目录和文件名二元组返回
  21. os.path.dirname(path) 返回path的目录。其实就是os.path.split(path)的第一个元素
  22. os.path.basename(path) 返回path最后的文件名。如何path以/或\结尾,那么就会返回空值。即os.path.split(path)的第二个元素
  23. os.path.exists(path) 如果path存在,返回True;如果path不存在,返回False
  24. os.path.isabs(path) 如果path是绝对路径,返回True
  25. os.path.isfile(path) 如果path是一个存在的文件,返回True。否则返回False
  26. os.path.isdir(path) 如果path是一个存在的目录,则返回True。否则返回False
  27. os.path.join(path1[, path2[, ...]]) 将多个路径组合后返回,第一个绝对路径之前的参数将被忽略
  28. os.path.getatime(path) 返回path所指向的文件或者目录的最后存取时间
  29. os.path.getmtime(path) 返回path所指向的文件或者目录的最后修改时间

六、sys模块

  1. sys.argv 命令行参数List,第一个元素是程序本身路径
  2. sys.exit(n) 退出程序,正常退出时exit(0)
  3. sys.version 获取Python解释程序的版本信息
  4. sys.maxint 最大的Int
  5. sys.path 返回模块的搜索路径,初始化时使用PYTHONPATH环境变量的值
  6. sys.platform 返回操作系统平台名称
  7. sys.stdout.write('please:')
  8. val = sys.stdin.readline()[:-1]

七、shelve 模块

  1. import shelve
  2. d = shelve.open('shelve_test') #打开一个文件
  3. class Test(object):
  4. def __init__(self,n):
  5. self.n = n
  6. t = Test(123)
  7. t2 = Test(123334)
  8. name = ["alex","rain","test"]
  9. d["test"] = name #持久化列表
  10. d["t1"] = t #持久化类
  11. d["t2"] = t2
  12. d.close()

八、xml处理模块

xml是实现不同语言或程序之间进行数据交换的协议,跟json差不多,但json使用起来更简单,不过,古时候,在json还没诞生的黑暗年代,大家只能选择用xml呀,至今很多传统公司如金融行业的很多系统的接口还主要是xml。
xml的格式如下,就是通过<>节点来区别数据结构的:

  1. <?xml version="1.0"?>
  2. <data>
  3. <country name="Liechtenstein">
  4. <rank updated="yes">2</rank>
  5. <year>2008</year>
  6. <gdppc>141100</gdppc>
  7. <neighbor name="Austria" direction="E"/>
  8. <neighbor name="Switzerland" direction="W"/>
  9. </country>
  10. <country name="Singapore">
  11. <rank updated="yes">5</rank>
  12. <year>2011</year>
  13. <gdppc>59900</gdppc>
  14. <neighbor name="Malaysia" direction="N"/>
  15. </country>
  16. <country name="Panama">
  17. <rank updated="yes">69</rank>
  18. <year>2011</year>
  19. <gdppc>13600</gdppc>
  20. <neighbor name="Costa Rica" direction="W"/>
  21. <neighbor name="Colombia" direction="E"/>
  22. </country>
  23. </data>

xml协议在各个语言里的都 是支持的,在python中可以用以下模块操作xml

  1. import xml.etree.ElementTree as ET
  2. tree = ET.parse("xmltest.xml")
  3. root = tree.getroot()
  4. print(root.tag)
  5. 遍历xml文档
  6. for child in root:
  7. print(child.tag, child.attrib)
  8. for i in child:
  9. print(i.tag,i.text)
  10. 只遍历year 节点
  11. for node in root.iter('year'):
  12. print(node.tag,node.text)

修改和删除xml文档内容

  1. import xml.etree.ElementTree as ET
  2. tree = ET.parse("xmltest.xml")
  3. root = tree.getroot()
  4. 修改
  5. for node in root.iter('year'):
  6. new_year = int(node.text) + 1
  7. node.text = str(new_year)
  8. node.set("updated","yes")
  9. tree.write("xmltest.xml")
  10. #删除node
  11. for country in root.findall('country'):
  12. rank = int(country.find('rank').text)
  13. if rank > 50:
  14. root.remove(country)
  15. tree.write('output.xml')

自己创建xml文档

  1. import xml.etree.ElementTree as ET
  2. new_xml = ET.Element("namelist")
  3. name = ET.SubElement(new_xml,"name",attrib={"enrolled":"yes"})
  4. age = ET.SubElement(name,"age",attrib={"checked":"no"})
  5. sex = ET.SubElement(name,"sex")
  6. sex.text = '33'
  7. name2 = ET.SubElement(new_xml,"name",attrib={"enrolled":"no"})
  8. age = ET.SubElement(name2,"age")
  9. age.text = '19'
  10. et = ET.ElementTree(new_xml) #生成文档对象
  11. et.write("test.xml", encoding="utf-8",xml_declaration=True)
  12. ET.dump(new_xml) #打印生成的格式

九、PyYAML模块

详见python yaml

十、ConfigParser模块

用于生成和修改常见配置文档,当前模块的名称在 python 3.x 版本中变更为 configparser。

  1. [DEFAULT]
  2. ServerAliveInterval = 45
  3. Compression = yes
  4. CompressionLevel = 9
  5. ForwardX11 = yes
  6. [bitbucket.org]
  7. User = hg
  8. [topsecret.server.com]
  9. Port = 50022
  10. ForwardX11 = no

如果想用python生成一个这样的文档怎么做呢?

  1. import configparser
  2. config = configparser.ConfigParser()
  3. config["DEFAULT"] = {'ServerAliveInterval': '45',
  4. 'Compression': 'yes',
  5. 'CompressionLevel': '9'}
  6. config['bitbucket.org'] = {}
  7. config['bitbucket.org']['User'] = 'hg'
  8. config['topsecret.server.com'] = {}
  9. topsecret = config['topsecret.server.com']
  10. topsecret['Host Port'] = '50022' # mutates the parser
  11. topsecret['ForwardX11'] = 'no' # same here
  12. config['DEFAULT']['ForwardX11'] = 'yes'
  13. with open('example.ini', 'w') as configfile:
  14. config.write(configfile)

写完了还可以再读出来哈。

  1. >>> import configparser
  2. >>> config = configparser.ConfigParser()
  3. >>> config.sections()
  4. []
  5. >>> config.read('example.ini')
  6. ['example.ini']
  7. >>> config.sections()
  8. ['bitbucket.org', 'topsecret.server.com']
  9. >>> 'bitbucket.org' in config
  10. True
  11. >>> 'bytebong.com' in config
  12. False
  13. >>> config['bitbucket.org']['User']
  14. 'hg'
  15. >>> config['DEFAULT']['Compression']
  16. 'yes'
  17. >>> topsecret = config['topsecret.server.com']
  18. >>> topsecret['ForwardX11']
  19. 'no'
  20. >>> topsecret['Port']
  21. '50022'
  22. >>> for key in config['bitbucket.org']: print(key)
  23. ...
  24. user
  25. compressionlevel
  26. serveraliveinterval
  27. compression
  28. forwardx11
  29. >>> config['bitbucket.org']['ForwardX11']
  30. 'yes'

configparser增删改查语法

  1. [section1]
  2. k1 = v1
  3. k2:v2
  4. [section2]
  5. k1 = v1
  6. import ConfigParser
  7. config = ConfigParser.ConfigParser()
  8. config.read('i.cfg')
  9. # ########## 读 ##########
  10. #secs = config.sections()
  11. #print secs
  12. #options = config.options('group2')
  13. #print options
  14. #item_list = config.items('group2')
  15. #print item_list
  16. #val = config.get('group1','key')
  17. #val = config.getint('group1','key')
  18. # ########## 改写 ##########
  19. #sec = config.remove_section('group1')
  20. #config.write(open('i.cfg', "w"))
  21. #sec = config.has_section('wupeiqi')
  22. #sec = config.add_section('wupeiqi')
  23. #config.write(open('i.cfg', "w"))
  24. #config.set('group2','k1',11111)
  25. #config.write(open('i.cfg', "w"))
  26. #config.remove_option('group2','age')
  27. #config.write(open('i.cfg', "w"))

十一、hashlib模块

用于加密相关的操作,3.x里代替了md5模块和sha模块,主要提供 SHA1, SHA224, SHA256, SHA384, SHA512 ,MD5 算法

  1. import hashlib
  2. m = hashlib.md5()
  3. m.update(b"Hello")
  4. m.update(b"It's me")
  5. print(m.digest())
  6. m.update(b"It's been a long time since last time we ...")
  7. print(m.digest()) #2进制格式hash
  8. print(len(m.hexdigest())) #16进制格式hash

def digest(self, args, kwargs): # real signature unknown
“”” Return the digest value as a string of binary data. “””
pass
def hexdigest(self,
args, kwargs): # real signature unknown
“”” Return the digest value as a string of hexadecimal digits. “””
pass

  1. import hashlib
  2. # ######## md5 ########
  3. hash = hashlib.md5()
  4. hash.update('admin')
  5. print(hash.hexdigest())
  6. # ######## sha1 ########
  7. hash = hashlib.sha1()
  8. hash.update('admin')
  9. print(hash.hexdigest())
  10. # ######## sha256 ########
  11. hash = hashlib.sha256()
  12. hash.update('admin')
  13. print(hash.hexdigest())
  14. # ######## sha384 ########
  15. hash = hashlib.sha384()
  16. hash.update('admin')
  17. print(hash.hexdigest())
  18. # ######## sha512 ########
  19. hash = hashlib.sha512()
  20. hash.update('admin')
  21. print(hash.hexdigest())

还不够吊?python 还有一个 hmac 模块,它内部对我们创建 key 和 内容 再进行处理然后再加密

  1. import hmac
  2. h = hmac.new('wueiqi')
  3. h.update('hellowo')
  4. print h.hexdigest()

更多关于md5,sha1,sha256等介绍的文章看这里https://www.tbs-certificates.co.uk/FAQ/en/sha256.html

十二、Subprocess模块

The subprocess module allows you to spawn new processes, connect to their input/output/error pipes, and obtain their return codes. This module intends to replace several older modules and functions:
os.system
os.spawn*

  1. >>> subprocess.run(["ls", "-l"]) # doesn't capture output
  2. CompletedProcess(args=['ls', '-l'], returncode=0)
  3. >>> subprocess.run("exit 1", shell=True, check=True)
  4. Traceback (most recent call last):
  5. subprocess.CalledProcessError: Command 'exit 1' returned non-zero exit status 1
  6. >>> subprocess.run(["ls", "-l", "/dev/null"], stdout=subprocess.PIPE)
  7. CompletedProcess(args=['ls', '-l', '/dev/null'], returncode=0,
  8. stdout=b'crw-rw-rw- 1 root root 1, 3 Jan 23 16:23 /dev/null\n')

调用subprocess.run(…)是推荐的常用方法,在大多数情况下能满足需求,但如果你可能需要进行一些复杂的与系统的交互的话,你还可以用subprocess.Popen(),语法如下:

  1. p = subprocess.Popen("find / -size +1000000 -exec ls -shl {} \;",shell=True,stdout=subprocess.PIPE)
  2. print(p.stdout.read())

可用参数:

  • args:shell命令,可以是字符串或者序列类型(如:list,元组)
  • bufsize:指定缓冲。0 无缓冲,1 行缓冲,其他 缓冲区大小,负值 系统缓冲
  • stdin, stdout, stderr:分别表示程序的标准输入、输出、错误句柄
  • preexec_fn:只在Unix平台下有效,用于指定一个可执行对象(callable object),它将在子进程运行之前被调用
  • close_sfs:在windows平台下,如果close_fds被设置为True,则新创建的子进程将不会继承父进程的输入、输出、错误管道。
    所以不能将close_fds设置为True同时重定向子进程的标准输入、输出与错误(stdin, stdout, stderr)。
  • shell:同上
  • cwd:用于设置子进程的当前目录
  • env:用于指定子进程的环境变量。如果env = None,子进程的环境变量将从父进程中继承。
  • universal_newlines:不同系统的换行符不同,True -> 同意使用 \n
  • startupinfo与createionflags只在windows下有效
    将被传递给底层的CreateProcess()函数,用于设置子进程的一些属性,如:主窗口的外观,进程的优先级等等
    终端输入的命令分为两种:
  • 输入即可得到输出,如:ifconfig
  • 输入进行某环境,依赖再输入,如:python
    需要交互的命令示例
  1. import subprocess
  2. obj = subprocess.Popen(["python"], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
  3. obj.stdin.write('print 1 \n ')
  4. obj.stdin.write('print 2 \n ')
  5. obj.stdin.write('print 3 \n ')
  6. obj.stdin.write('print 4 \n ')
  7. out_error_list = obj.communicate(timeout=10)
  8. print out_error_list

十三、 re模块

  1. '.' 默认匹配除\n之外的任意一个字符,若指定flag DOTALL,则匹配任意字符,包括换行
  2. '^' 匹配字符开头,若指定flags MULTILINE,这种也可以匹配上(r"^a","\nabc\neee",flags=re.MULTILINE)
  3. '$' 匹配字符结尾,或e.search("foo$","bfoo\nsdfsf",flags=re.MULTILINE).group()也可以
  4. '*' 匹配*号前的字符0次或多次,re.findall("ab*","cabb3abcbbac") 结果为['abb', 'ab', 'a']
  5. '+' 匹配前一个字符1次或多次,re.findall("ab+","ab+cd+abb+bba") 结果['ab', 'abb']
  6. '?' 匹配前一个字符1次或0
  7. '{m}' 匹配前一个字符m
  8. '{n,m}' 匹配前一个字符nm次,re.findall("ab{1,3}","abb abc abbcbbb") 结果'abb', 'ab', 'abb']
  9. '|' 匹配|左或|右的字符,re.search("abc|ABC","ABCBabcCD").group() 结果'ABC'
  10. '(...)' 分组匹配,re.search("(abc){2}a(123|456)c", "abcabca456c").group() 结果 abcabca456c
  11. '\A' 只从字符开头匹配,re.search("\Aabc","alexabc") 是匹配不到的
  12. '\Z' 匹配字符结尾,同$
  13. '\d' 匹配数字0-9
  14. '\D' 匹配非数字
  15. '\w' 匹配[A-Za-z0-9]
  16. '\W' 匹配非[A-Za-z0-9]
  17. 's' 匹配空白字符、\t\n\r , re.search("\s+","ab\tc1\n3").group() 结果 '\t'
  18. '(?P<name>...)' 分组匹配 re.search("(?P<province>[0-9]{4})(?P<city>[0-9]{2})(?P<birthday>[0-9]{4})","371481199306143242").groupdict("city") 结果{'province': '3714', 'city': '81', 'birthday': '1993'}

最常用的匹配语法

  1. re.match 从头开始匹配
  2. re.search 匹配包含
  3. re.findall 把所有匹配到的字符放到以列表中的元素返回
  4. re.splitall 以匹配到的字符当做列表分隔符
  5. re.sub 匹配字符并替换

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

  1. re.I(re.IGNORECASE): 忽略大小写(括号内是完整写法,下同)
  2. M(MULTILINE): 多行模式,改变'^''$'的行为(参见上图)
  3. S(DOTALL): 点任意匹配模式,改变'.'的行为

python学习day5

1
未经许可,不得转载,否则将受到作者追究,博主联系方式见首页右上角
  • 转载请注明来源:python学习day5
  • 本文永久链接地址:http://www.52devops.com/chuck/818.html

该文章由 发布

这货来去如风,什么鬼都没留下!!!
发表我的评论
取消评论
代码 贴图 加粗 链接 删除线 签到