问题:按照特定的文本模式进行匹配或查找

解决方法:

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.文本模式的匹配和查找的更多相关文章

  1. python cookbook 字符串和文本

    使用多个界定符分隔字符串 import re line = 'asdf fjdk; afed, fjek,asdf, foo' print(re.split(r'[;,\s]\s*', line)) ...

  2. python cookbook学习笔记 第一章 文本(1)

    1.1每次处理一个字符(即每次处理一个字符的方式处理字符串) print list('theString') #方法一,转列表 结果:['t', 'h', 'e', 'S', 't', 'r', 'i ...

  3. python cookbook学习笔记 第一章 文本(2)

    1.6合并字符串 ka=list('kaluoc') #字符串转成字符串列表 print ''.join(ka) #大量的字符串相连,join是最高效的 print '%s%s something % ...

  4. python书籍推荐:Python Cookbook第三版中文

    所属网站分类: 资源下载 > python电子书 作者:熊猫烧香 链接:http://www.pythonheidong.com/blog/article/44/ 来源:python黑洞网 内容 ...

  5. python cookbook学习1

    python cookbook学习笔记 第一章 文本(1) 1.1每次处理一个字符(即每次处理一个字符的方式处理字符串) print list('theString') #方法一,转列表 结果:['t ...

  6. 模板—字符串—AC自动机(多模式串,单文本串)

    模板—字符串—AC自动机(多模式串,单文本串) Code: #include <queue> #include <cstdio> #include <cstring> ...

  7. python中使用%与.format格式化文本

    初学python,看来零零碎碎的格式化文本的方法,总结一下python中格式化文本的方法.使用不当的地欢迎指出谢谢. 1.首先看使用%格式化文本 常见的占位符: 常见的占位符有: %d 整数 %f 浮 ...

  8. HDU - 2222,HDU - 2896,HDU - 3065,ZOJ - 3430 AC自动机求文本串和模式串信息(模板题)

    最近正在学AC自动机,按照惯例需要刷一套kuangbin的AC自动机专题巩固 在网上看过很多模板,感觉kuangbin大神的模板最为简洁,于是就选择了用kuangbin大神的模板. AC自动机其实就是 ...

  9. Python:字符串

    一.序列的概念 序列是容器类型,顾名思义,可以想象,“成员”们站成了有序的队列,我们从0开始进行对每个成员进行标记,0,1,2,3,...,这样,便可以通过下标访问序列的一个或几个成员,就像C语言中的 ...

随机推荐

  1. Linux信号处理

    给进程设置僵尸状态的目的是维护子进程的信息,以便父进程在以后某个时间获取.这些信息包括子进程的进程ID.终止状态以及资源利用信息(CPU时间,内存使用量等等).如果一个进程终止,而该进程有子进程处于僵 ...

  2. [BS-10] 统一设置app所有页面的“返回”按钮样式

    统一设置app所有页面的“返回”按钮样式 如果想统一设置app所有页面的“返回”按钮样式,首先自定义WZNavigationController类继承UINavigationController类,然 ...

  3. 获取启动画面图片的string

    支持 iPhone 以下. 支持 iPhone 及 iPad +(NSString*)getLaunchImageName { NSArray* images= @[@"LaunchImag ...

  4. Android --账户注销

    参考博客:android如何实现注销功能 Intent logoutIntent=new Intent(SettingActivity.this,LoginActivity.class); //在执行 ...

  5. linux内核编译相关

    参考:http://www.arm.linux.org.uk/docs/kerncomp.php 一. 内核编译1) linux 2.4make clean/make mrpropermake dep ...

  6. 第九篇 SQL Server安全透明数据加密

    本篇文章是SQL Server安全系列的第九篇,详细内容请参考原文. Relational databases are used in an amazing variety of applicatio ...

  7. REST Security with JWT using Java and Spring Security

    Security Security is the enemy of convenience, and vice versa. This statement is true for any system ...

  8. Array.prototype.slice && Array.prototype.splice 用法阐述

    目的 对于这两个数组操作接口,由于不理解, 往往被误用, 或者不知道如何使用.本文尝试给出容易理解的阐述. 数组 什么是数组? 数组是一个基本的数据结构, 是一个在内存中依照线性方式组织元素的方式, ...

  9. D3D9 浮点精度的问题

    最近在对我们的渲染引擎进行优化的时候,发现一个奇怪的现象,因为我们做了Pre-Z(把比较大的物体先绘制一遍,这个时候关闭颜色写,只开启深度测试和写入,目的是为了减少后面一些不可见像素的计算.),面在绘 ...

  10. mysql中all privileges包含哪些权限

    mysql> grant all privileges on test.* to 'ybb'@'%' identified by 'ybb'; Query OK, 0 rows affected ...