【python cookbook】【字符串与文本】4.文本模式的匹配和查找
问题:按照特定的文本模式进行匹配或查找
解决方法:
1、简单的文字匹配,只需使用str.find()、str.startswith()、str.endswith()或类似的函数即可;
2、复杂的匹配,需要使用正则表达式以及re模块
>>> import re
>>> text1='11/23/2016'
>>> text2='Nov 23,2016'
>>> 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
>>>
若针对同一模式做多次匹配,那么通常会先将正则表达式模式预编译成一个模式对象:
>>> text='today is 11/23/2016. Pycon starts 3/12/2013'
>>> datepat.findall(text) #如果要找到整个文本中所有匹配项应该使用findall(),match()总是尝试在字符串的开头找到匹配项
['11/23/2016', '3/12/2013']
>>> datepat.match(text)
>>> print(datepat.match(text))
None
>>>
findall()方法搜索整个文本并找出所有的匹配项然后将他们以列表的形式返回。若想以迭代的方式找出匹配项,可以使用finditer()方法。
当使用正则表达式时,通常会将部门模式用括号包起来的方式引入“捕获组”,它能简化后续对匹配文本的处理,因为每个组的内容都可以单独提取出来:
>>> datepat=re.compile(r'(\d+)/(\d+)/(\d+)') #引入“捕获组”
>>> m=datepat.match('11/23/2016')
>>> m
<_sre.SRE_Match object; span=(0, 10), match='11/23/2016'>
>>> m.group(0)
'11/23/2016'
>>> m.group(1) #组内元素单独提取出来
''
>>> m.group(2)
''
>>> m.group(3)
''
>>> m.group()
'11/23/2016'
>>> m.groups()
('', '', '')
>>> month,day,year=m.groups()
>>> month
''
>>> day
''
>>> year
''
>>> text
'today is 11/23/2016. Pycon starts 3/12/2013'
>>> datepat.findall(text)
[('', '', ''), ('', '', '')]
>>> for month,day,year in datepat.findall(text):
print('{}-{}-{}'.format(year,month,day)) 2016-11-23
2013-3-12
>>>
>>> for m in datepat.finditer(text):#使用迭代方式查找匹配项
print( m.groups()) ('', '', '')
('', '', '')
>>>
总之,若打算执行很多匹配或查找操作的话,首先用re.compile()对模式进行预编译,然后使用像match()、findall()、finditer()这样的方法做匹配和搜索。
补充:
注意match()只会检查字符串的开头,想要精确匹配的话,在模式中包含一个结束标记($)即可:
>>> datepat
re.compile('(\\d+)/(\\d+)/(\\d+)')
>>> m=datepat.match('abc11/23/2016defjh')
>>> print(m)
None
>>> datepat=re.compile(r'(\d+)/(\d+)/(\d+)$')
>>> datepat.match('11/23/2016defjh')
>>> datepat.match('11/23/2016')
<_sre.SRE_Match object; span=(0, 10), match='11/23/2016'>
>>>
若只是简单的执行文本匹配和搜索操作,通常可以省略预编译步骤:
>>> text
'today is 11/23/2016. Pycon starts 3/12/2013'
>>> re.findall(r'(\d+)/(\d+)/(\d+)',text)
[('', '', ''), ('', '', '')]
>>>
【python cookbook】【字符串与文本】4.文本模式的匹配和查找的更多相关文章
- python cookbook 字符串和文本
使用多个界定符分隔字符串 import re line = 'asdf fjdk; afed, fjek,asdf, foo' print(re.split(r'[;,\s]\s*', line)) ...
- python cookbook学习笔记 第一章 文本(1)
1.1每次处理一个字符(即每次处理一个字符的方式处理字符串) print list('theString') #方法一,转列表 结果:['t', 'h', 'e', 'S', 't', 'r', 'i ...
- python cookbook学习笔记 第一章 文本(2)
1.6合并字符串 ka=list('kaluoc') #字符串转成字符串列表 print ''.join(ka) #大量的字符串相连,join是最高效的 print '%s%s something % ...
- python书籍推荐:Python Cookbook第三版中文
所属网站分类: 资源下载 > python电子书 作者:熊猫烧香 链接:http://www.pythonheidong.com/blog/article/44/ 来源:python黑洞网 内容 ...
- python cookbook学习1
python cookbook学习笔记 第一章 文本(1) 1.1每次处理一个字符(即每次处理一个字符的方式处理字符串) print list('theString') #方法一,转列表 结果:['t ...
- 模板—字符串—AC自动机(多模式串,单文本串)
模板—字符串—AC自动机(多模式串,单文本串) Code: #include <queue> #include <cstdio> #include <cstring> ...
- python中使用%与.format格式化文本
初学python,看来零零碎碎的格式化文本的方法,总结一下python中格式化文本的方法.使用不当的地欢迎指出谢谢. 1.首先看使用%格式化文本 常见的占位符: 常见的占位符有: %d 整数 %f 浮 ...
- HDU - 2222,HDU - 2896,HDU - 3065,ZOJ - 3430 AC自动机求文本串和模式串信息(模板题)
最近正在学AC自动机,按照惯例需要刷一套kuangbin的AC自动机专题巩固 在网上看过很多模板,感觉kuangbin大神的模板最为简洁,于是就选择了用kuangbin大神的模板. AC自动机其实就是 ...
- Python:字符串
一.序列的概念 序列是容器类型,顾名思义,可以想象,“成员”们站成了有序的队列,我们从0开始进行对每个成员进行标记,0,1,2,3,...,这样,便可以通过下标访问序列的一个或几个成员,就像C语言中的 ...
随机推荐
- APP源码集中打包大放送!十一个千万级别APP源码随意处置!
小伙伴们还在一个一个苦苦寻找各类APP源码吗?此贴集中打包最常用APP的源码,你想得到的APP,这里都有! 想做商城?这里有天猫! 想做同城服务?这里有大众点评! 想做外卖?这里有饿了么! 想做视频? ...
- [BS-04] 在iOS中对系统定义的类的readonly属性可通过KVC进行赋值
系统提供的类的readonly属性可通过KVC进行赋值 UITabBarController.h @interface UITabBarController : UIViewController &l ...
- CentOS 学习笔记
整理基础的CentOS常用命令 http://os.51cto.com/art/201003/190801.htm 在Hyper-V中的CentOS虚拟机中使用网络 http://blog.earth ...
- 各种设备的CSS3 MediaQuery整理及爽歪歪写法
链接:http://dwz.cn/1gZQ06 ------------------------------------------------------ 备注:内容未测试过,转载的,留着备用. - ...
- mac 启动nfsd共享
# cat /etc/exports /Users/guang/jumpserver -maproot=root:wheel -alldirs -rw -network 192.168.244.0 - ...
- LCA和RMQ
下面写提供几个学习LCA和RMQ的博客,都很通熟易懂 http://dongxicheng.org/structure/lca-rmq/ 这个应该是讲得最好的,且博主还有很多其他文章,可以读读,感觉认 ...
- 重复点击主界面(TabBar)按钮刷新界面--点击状态栏回到顶部
1.监听按钮点击 2.判断是否是点击的同一个按钮(记录上次点击的按钮) 3.当重复点击相同按钮时,需要获取当前按钮对应控制器刷新界面 3.1 判断是否重复点击按钮,代码写在哪里? ...
- Leetcode: Shuffle an Array
Shuffle a set of numbers without duplicates. Example: // Init an array with set 1, 2, and 3. int[] n ...
- ArrayList和LinkedList的几种循环遍历方式及性能对比分析(转载)
原文地址: http://www.trinea.cn/android/arraylist-linkedlist-loop-performance/ 原文地址: http://www.trinea.cn ...
- Python学习总结17:exec和eval执行求值字符串
有些时候可能会需要动态地创造Python代码,然后将其作为语句执行或作为表达式计算. 1. exec >>>exec "print 'Hello, world!'" ...