Python Cookbook学习笔记ch2_01
第二章,也可以去这里查看笔记噢虫洞在这里
2.1使用多个界定符分隔字符串
- 问题:将一个字符串分隔为多个字段,但是分隔符并不是固定的
- 方案:string对象的split() 只适用于简单的字符串分隔,他不允许有多个分隔符或者分隔符周围不确定的空格。可以使用re.split()
line = 'asdf fsff; frf, dfsfe,asd. daffpp'
import re
re.split(r'[.;,\s]\s*',line)
['asdf', 'fsff', 'frf', 'dfsfe', 'asd', 'daffpp']
- 当使用re.split() 时需要注意正则表达式是否包含一个括号捕获分组。如果有,则被匹配的文本也会出现在结果列表中
fields = re.split(r'(;|,|\s)\s*',line)
fields
['asdf', ' ', 'fsff', ';', 'frf', ',', 'dfsfe', ',', 'asd.', ' ', 'daffpp']
- 如果你不想保留分隔字符串到结果中去,但仍需使用分组正则表达式,确保你的分组是非捕获分组,如(?:…)
re.split(r'(?:,|;|\s)\s*',line)
['asdf', 'fsff', 'frf', 'dfsfe', 'asd.', 'daffpp']
2.2字符串开头或结尾匹配
- 问题:需要指定文本模式去检查字符串的开头或者结尾,比如文件名后缀
- 方案:使用str.startswith()或者str.endswith()
filename = 'spam.txt'
filename.startswith('file:')
False
filename.endswith('.txt')
True
url = 'http://www.python.org'
url.startswith('http://')
True
- 如果想检查多种匹配可能,只需要将所有的匹配项放入到一个元祖中去即可
filenames = ['Makefile','foo.c','bar.py','spam.c','sapm.h']
[name for name in filenames if name.endswith(('.c','.h'))]
['foo.c', 'spam.c', 'sapm.h']
any(name.endswith('.py') for name in filenames)
True
from urllib.request import urlopen
def read_data(name):if name.startswith(('http:','https','ftp')):return urlopen(name).read()else:with open(name) as f:return f.read()
- 注意:上述两个方法中必须传入一个元祖作为参数,如果传入的是list或者其他的,需要首先调用tuple() 函数进行转换。
choices = ['http:','ftp:']
url = 'http://www.python.org'
url.startswith(choices)
---------------------------------------------------------------------------TypeError Traceback (most recent call last)<ipython-input-23-78cd8b4bba7d> in <module>()1 choices = ['http:','ftp:']2 url = 'http://www.python.org'
----> 3 url.startswith(choices)TypeError: startswith first arg must be str or a tuple of str, not list
url.startswith(tuple(choices))
True
- startswith()和endswith()也可以由切片来完成
filename = 'spam.txt'
filename[-4:] == '.txt'
True
- 也可以使用正则表达式实现
import re
url = 'http://www.pyhton.org'
re.match('http:|https:|ftp:',url)
<_sre.SRE_Match object; span=(0, 5), match='http:'>
2.3使用shell通配符匹配字符串
- 问题:想使用 Unix Shell 中常用的通配符 (比如 .py , Dat[0-9].csv 等) 去匹配文本字符串
- 方案:fnmatch模块提供了两个函数:fnmatch()和 fnmatchcase()
from fnmatch import fnmatch,fnmatchcase
fnmatch('foo.txt','*.txt')
True
fnmatch('foo.txt','?oo.txt')
True
fnmatch('Dat45.csv','Dat[0-9]*')
True
names = ['Dat1.csv','Dat2.csv','config.ini','foo.py']
[name for name in names if fnmatch(name,'Dat[1-9].csv')]
#[name for name in names if fnmatch(name,'Dat*.csv')]
['Dat1.csv', 'Dat2.csv']
- fnmatch()使用底层操作系统的大小写敏感规则,根据您的操作系统会有区别。如果您的系统是敏感的,该函数也是敏感的
fnmatch('foo.txt','.Txt')
False
- fnmatchcase()函数可以代替,它完全使用你的模式大小写去匹配
fnmatchcase('foo.txt','.Txt')
False
addresses = [
'5412 N CLARK ST',
'1060 W ADDISON ST',
'1039 W GRANVILLE AVE',
'2122 N CLARK ST',
'4802 N BROADWAY',
]
from fnmatch import fnmatchcase
[addr for addr in addresses if fnmatchcase(addr,'*ST')]
['5412 N CLARK ST', '1060 W ADDISON ST', '2122 N CLARK ST']
[addr for addr in addresses if fnmatchcase(addr,'54[0-9][0-9] *CLARK*')]
['5412 N CLARK ST']
2.4字符串匹配和搜索
- 问题:需要匹配或者搜索特定模式的文本
- 方案:可以使用str.find()和str.endswith()和str.startswith() 函数
text = 'yeah, but no, but yeah,but no,but yeah'
text == 'yeah'
False
text.startswith('yeah')
True
text.endswith('no')
False
- find() 函数会返回搜索文本第一次出现的位置
text.find('no')
10
- 对于复杂的匹配则需要使用正则表达式和re模块
- \d+ 是指匹配一个或者多个数字
text1 = '11/27/2012'
text2 = 'Nov 27,2012'
import re
if re.match(r'\d+/\d+/\d+',text1):print('yes')
else:print('no')
yes
if re.match(r'\d+/\d+/\d+',text2):print('yes')
else:print('no')
no
- 如果想使用同一个模式去匹配多次,应该先将匹配模式字符串编译为模式对象
- match() 函数总是从字符串的开始去匹配,如果像查找字符串的任意位置可以使用findall()方法
datepat = re.compile(r'\d+/\d+/\d+')
if re.match(data,text1):print('yes')
else:print('no')
yes
text = 'Today is 11/23/2018.Pycon starts 3/13/2019'
datepat.findall(text)
['11/23/2018', '3/13/2019']
- 在定义正则式的时候常会使用括号去分组捕获。因为分组捕获使得后面的处理更加简单,可以分别将每个组的内容提取出来
datepat2 = re.compile(r'(\d+)/(\d+)/(\d+)')
m = datepat2.match('11/23/2018')
m
<_sre.SRE_Match object; span=(0, 10), match='11/23/2018'>
m.group(0)
'11/23/2018'
m.group(1)
'11'
m.group(2)
'23'
m.group(3)
'2018'
m.groups()
('11', '23', '2018')
month,day,year = m.groups()
year
'2018'
- findall()会搜素文本并以list 的形式返回匹配的结果。
text = 'Today is 11/23/2018.Pycon starts 3/13/2019'
datepat3 = re.compile(r'(\d+)/(\d+)/(\d+)')
datepat3.findall(text)
['11/23/2018', '3/13/2019']
for month,day,year in datepat3.findall(text):print('{}-{}-{}'.format(year,month,day))
2018-11-23
2019-3-13
- 使用re模块的基本方法是:先使用re.compile() 编译正则表达式字符串,然后使用match()、findall()或者finditer() 方法
- match() 函数从字符串开始的地方匹配,但他的结果有可能不是期望的
datepat = re.compile(r'(\d+)/(\d+)/(\d+)')
m = datepat.match('11/27/2012asdafa')
m
<_sre.SRE_Match object; span=(0, 10), match='11/27/2012'>
m.group()
'11/27/2012'
- 如果需要精确匹配可以在正则表达式的末尾加上 $
datepat = re.compile(r'(\d+)/(\d+)/(\d+)$')
#不会有任何输出
datepat.match('11/27/2012asdafa')
datepat.match('11/27/2012')
<_sre.SRE_Match object; span=(0, 10), match='11/27/2012'>
2.5字符串搜索与替换
- 问题:想在字符串中搜索制定的模式并替换
- 方案:直接使用str.replace()
text = 'yeah,but no,yeah,but no,but yeah'
text.replace('yeah','yea')
'yea,but no,yea,but no,but yea'
- 对于更为复杂的可以使用re模块的sub()函数
*sub() 函数中的第一个参数是被匹配的模式,第二个参数是替换模式。反斜杠数字比如 \3 指向前面模式的捕获组号。
text = 'today is 11/27/2012.PyCon starts 3/13/2013'
import re
re.sub(r'(\d+)/(\d+)/(\d+)',r'\3-\1-\2',text)
'today is 2012-11-27.PyCon starts 2013-3-13'
- 如果想要多次匹配相同的模式,可以使用先编译来提升性能
text = 'today is 11/27/2012.PyCon starts 3/13/2013'
import re
datepat = re.compile(r"(\d+)/(\d+)/(\d+)")
datepat.sub(r'\3-\1-\2',text)
'today is 2012-11-27.PyCon starts 2013-3-13'
- 对于更复杂的,可以传递一个替换回调函数
from calendar import month_abbr
def change_date(m):mon_name = month_abbr[int(m.group(1))]return '{} {} {}'.format(m.group(2),mon_name,m.group(3))text = 'today is 11/27/2012.PyCon starts 3/13/2013'
datepat.sub(change_date,text)
'today is 27 Nov 2012.PyCon starts 13 Mar 2013'
- 如果除了想替换并且有多少地方发生了替换可以使用subn()
text = 'today is 11/27/2012.PyCon starts 3/13/2013'
new_text,n = datepat.subn(r'\3-\1-\2',text)
new_text
'today is 2012-11-27.PyCon starts 2013-3-13'
n
2
2.5字符串忽略大小写的搜索替换
- 问题:以忽略大小写的方式进行搜索替换
- 方案:可以使用re模块的时候提供一个参数re.IGNORECASE
text = 'UPDATE PYTHON,lower python,Mixed Python'
re.findall('python',text,flags=re.IGNORECASE)
['PYTHON', 'python', 'Python']
re.sub('python','snake',text,flags=re.IGNORECASE)
'UPDATE snake,lower snake,Mixed snake'
Python Cookbook学习笔记ch2_01相关推荐
- Machine Learning with Python Cookbook 学习笔记 第8章
Chapter 8. Handling Images 前言 本笔记是针对人工智能典型算法的课程中Machine Learning with Python Cookbook的学习笔记 学习的实战代码都放 ...
- Machine Learning with Python Cookbook 学习笔记 第9章
Chapter 9. Dimensionality Reduction Using Feature Extraction 前言 本笔记是针对人工智能典型算法的课程中Machine Learning w ...
- Machine Learning with Python Cookbook 学习笔记 第6章
Chapter 6. Handling Text 本笔记是针对人工智能典型算法的课程中Machine Learning with Python Cookbook的学习笔记 学习的实战代码都放在代码压缩 ...
- python Cookbook 学习笔记(一)
文章目录 前言 一. 数据结构和算法 1.获取可迭代对象部分元素 用处讨论 2. 保存最后N个元素常利用depue队列特性:先进先出 3. 找到最大或最小的N个元素 4. 创建一键多值的字典 5. 让 ...
- python cookbook 学习笔记 -- 1.5 去除字符串两端空格
任务:将字符串中开头和结尾的多余空格去掉 解决方案: 使用string对象的lstrip,rstrip,strio方法.这几个方法都不需要参数,可以直接返回一个删除了开头,末尾或者两端的空格的原字符串 ...
- python做直方图-python OpenCV学习笔记实现二维直方图
本文介绍了python OpenCV学习笔记实现二维直方图,分享给大家,具体如下: 官方文档 – https://docs.opencv.org/3.4.0/dd/d0d/tutorial_py_2d ...
- python 正则学习笔记
python 正则学习笔记 官方document #1.0 import re m=re.search('(?<=abc)def','cxabcdefgb')print(m.group(0))# ...
- Python数据结构学习笔记——链表:无序链表和有序链表
目录 一.链表 二.无序链表 实现步骤分析 三.无序链表的Python实现代码 四.有序链表 实现步骤分析 五.有序链表的Python实现代码 结语 一.链表 链表中每一个元素都由为两部分构成:一是该 ...
- Python数据结构学习笔记——队列和双端队列
目录 一.队列的定义 二.队列 实现步骤分析 三.队列的Python实现代码 四.队列的应用 六人传土豆游戏 五.双端队列的定义 六.双端队列 实现步骤分析 七.双端队列的Python实现代码 八.双 ...
最新文章
- windows下将iso文件挂载到文件夹
- 离散数学 关系和有向图
- ad16不能去除铺铜_净水处理-原水中的二氧化硅、铜和铁对锅炉运行的影响
- Java的synchronized关键字:同步机制总结
- Part 2 – Deep analysis using Androguard tools
- 洛谷——P1012 拼数
- 关于单元测试脚手架的几点思考
- Java实现动态加载页面_[Java教程]动态加载页面数据的小工具 javascript + jQuery (持续更新)...
- lighty2.0沙箱版本的协议和配置分析采用ragel 成功案例
- 文本特征提取方法研究
- python修改pdf文件
- java程序员培训班要多少钱,一招彻底弄懂!
- 求三角形外接圆 hdu4720
- 读《大学生上课为什么一定要认真听讲》有感
- tree.js 酷炫的效果,人脸识别签到思路,html5 3D微信头像自动抽奖代码
- Flask之钩子函数
- Pro_07丨波动率因子3.0与斜率因子
- umijs 隐藏开发工具_如何定制企业级前端研发框架?(基于 UmiJS)
- 智能计数器控制板的功能及应用有哪些?
- Hadoop启动操作过程及常见错误
热门文章
- setDaemon详解
- bodyPaser.urlencoded extended
- A20 uboot和kernel的编译环境和方法
- 荣耀20计算机找不到,荣耀20连接电脑怎么传文件?连接电脑不显示没反应如何解决...
- 程序员的成长之路(一)
- 好想好想找个角落,自己躲起来,写自己的心情
- 计算机二级成绩查询233网校,hao123_上网从这里开始
- vue element el-upload 上传文档、压缩包表格
- 【VSCode】Windows 下搭建 Fortran 环境
- 副本技能-exe4j将可运行Jar包转换为exe程序