学习《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()方法
若正则表达式没有分组,则返回的是字符串列表,分组了返回的是元组的列表。
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
作为第二参数可以忽略大小写>>> 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的文件。已存在同名文件就会覆写,注意使用,同时也可以移动之后指定名称