python办公自动化

python办公自动化

学习《Python 编程快速上手 让繁琐工作自动化 》笔记

正则表达式

所需包为re,\d表示匹配一个数字

phoneNumRegex = re.compile(r'\d\d\d-\d\d\d-\d\d\d\d')    #匹配电话号码
>>> mo = phoneNumRegex.search('My number is 415-555-4242.') 
>>> print('Phone number found: ' + mo.group()) 
Phone number found: 415-555-4242 

模式的分组

>>> phoneNumRegex = re.compile(r'(\d\d\d)-(\d\d\d-\d\d\d\d)')  #用括号将模式分组,分组为1,2组
>>> mo = phoneNumRegex.search('My number is 415-555-4242.') 
>>> mo.group(1)     #分组0或默认返回整个匹配的文本
'415' 
>>> mo.groups()    #一次获得所有分组
('415', '555-4242') 

管道|的使用

>>> heroRegex = re.compile (r'Batman|Tina Fey')   #用|隔开,表示或者,会返回一个匹配到的对象
>>> mo1 = heroRegex.search('Batman and Tina Fey.') 
>>> mo1.group() 
'Batman' 
>>> batRegex = re.compile(r'Bat(man|mobile|copter|bat)') 
>>> mo = batRegex.search('Batmobile lost a wheel') 
>>> mo.group() 
'Batmobile' 
>>> mo.group(1)          #使用了括号进行分组的第一组
'mobile'

问号实现可选匹配,及?前面的模式可存在可不存在,*表示可存在零次或任意多次,+表示匹配一次或多次,用{2}表示指定匹配2次,{3,5}可以匹配3,4,5次,默认是贪心匹配,即最多匹配次数。在花括号后面加上?即可实现非贪心匹配。
findall()方法
若正则表达式没有分组,则返回的是字符串列表,分组了返回的是元组的列表。

  • \d 0-9任何数字
  • \D 除了0-9以外的任何字符
  • \w 任何字母、数字或下划线字符(可以认为是匹配“单词”字符)
  • \W 除字母、数字和下划线以外的任何字符
  • \s 空格、制表符或换行符(可以认为是匹配“空白”字符)
  • \S 除空格、制表符和换行符以外的任何字符
    [0-5]只匹配数字0到5,用中括号括起来即匹配括号中任一字符,如[a-zA-Z0-9]
    re.compile(r'[^aeiouAEIOU]') 通过在字符分类的左方括号后加上一个插入字符^ ,就可以得到“非字符类” 。非字符类将匹配不在这个字符类中的所有字符。
    re.compile(r'^Hello') 匹配以Hello开始的字符串
    re.compile(r'\d$')匹配以0到9结束的字符串
    .(小数点)匹配除了换行以外所有字符
    re.compile('.*', re.DOTALL) 可以让其匹配换行符
    re.compile(r'robocop', re.I),或者传入re.IGNORECASE作为第二参数可以忽略大小写
    sub()方法替换
>>> namesRegex = re.compile(r'Agent \w+') 
>>> namesRegex.sub('CENSORED', 'Agent Alice gave the secret documents to Agent Bob.') 
'CENSORED gave the secret documents to CENSORED.' 

\1表示在替换中输入分组1的文本

>>> agentNamesRegex = re.compile(r'Agent (\w)\w*') 
>>> agentNamesRegex.sub(r'\1****', 'Agent Alice told Agent Carol that Agent 
Eve knew Agent Bob was a double agent.') 
A**** told C**** that E**** knew B**** was a double agent.'

可以向 re.compile()传入变量 re.VERBOSE,作为第二个参数,从而忽略正则表达式字符串中的空白字符和注释,及分行写,更加简洁明了。

phoneRegex = re.compile(r'''( 
    (\d{3}|\(\d{3}\))?     # area code 
    (\s|-|\.)?       # separator 
    (\d{3})       # first 3 digits 
    (\s|-|\.)       # separator 
    (\d{4})       # last 4 digits 
    (\s*(ext|x|ext.)\s*(\d{2,5}))?  # extension 
    )''', re.VERBOSE) 

但是re.compile()只接受一个值作为参数,于是可以使用|来实现多参数

读写文件

>>> os.path.join('usr', 'bin', 'spam')  #可以得到正确的路径字符串
>os.getcwd() #得到当前目录
>os.chdir('C:\\Windows\\System32')   #改变当前目录
>. 表示当前目录, ..表示父文件夹,.\是可以省略的,因为默认就是当前目录
>>> os.makedirs('C:\\delicious\\walnut\\waffles')  #创建新的文件夹,保证路径完整

调用 os.path.abspath(path)将返回参数的绝对路径的字符串,调用 os.path.isabs(path)判断是否为绝对路径,os.path.relpath(path, start)将返回从 start 路径到 path 的相对路径的字符串,start缺省则默认当前路径。
os.path.dirname(path)返回Path中最后一个\之前的所有内容,也就是路径名,文件名是基本名basename,os.path.split(calcFilePath)会得到一个路径名+基本名的列表元组。
os.path.getsize(),得到的是字节数.os.listdir(), os.path.exists(),isdir(),isfile()
with open(path) as file_obj,可以省略关闭文件的操作,文件对象有readlines(),readline()等方法
write(text)写入内容,pprint.pformat()可以将列表或者字典中的内容漂亮地返回成字符串。

组织文件

shutil模块

shutil.copy('C:\\spam.txt', 'C:\\delicious')         #指定路径
shutil.copy('eggs.txt', 'C:\\delicious\\eggs2.txt')  #指定复制后的名字,都是返回复制后的文件的路径
shutil.copytree('C:\\bacon', 'C:\\bacon_backup')  #复制整个文件夹bacon的内容到bacon_backup文件夹中
shutil.move('C:\\bacon.txt', 'C:\\eggs')  #移动文件夹,同样返回移动后的路径,若已存在eggs,就是移动到此文件夹中去,否则会将其改成eggs的文件。已存在同名文件就会覆写,注意使用,同时也可以移动之后指定名称

你可能感兴趣的:(python办公自动化,正则表达式,python)