【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语言中的 ...
随机推荐
- 利用DBMS_ROWID.ROWID_CREATE来找出事务等待的行数据
在v$session视图中有四个字段,如下: Wait information in v$session view ROW_WAIT_OBJ# NUMBER Object ID for the tab ...
- 消息队列MQ
基本版本 Queue 代码: using System.Collections.Generic; using System.Linq; using System.Web; using System.W ...
- Windows网络共享权限设置
文件共享权限有两种权限设置,只要理解这两种权限设置就可以在域控灵活运用. 第一种是网络共享权限 共享权限是控制用户通过网络访问共享文件夹的手段,共享权限仅当用户通过网络访问时才有效,本地用户不受此权限 ...
- Java学习——变量类型
Java有3类变量 局部变量 成员变量(实例变量) 类变量(静态变量) 局部变量 局部变量声明在方法.构造方法或者语句块中: 局部变量在方法.构造方法.或者语句块被执行的时候创建,当它们执行完成后,变 ...
- Swing 顶层容器
顶层容器值得是容纳其他容器的容器组件,包括JFrame类,JWindows类,JDialog类,JApplet等.Swing中的顶层容器类Swing提供三个顶层容器类:JFrame,JDialog和J ...
- Orchard学习系列-----如何运行的
感慨:当接触到微软这套程序时,代码实在是太好了,好的几乎都读不懂.很久之前就对这个套开源程序特别感兴趣,但读不明白也让人郁闷. 背景(Orchard官网): 可组装系统的CMS系统,OrChard在运 ...
- 学习OpenCV——ORB简化版&Location加速版
根据前面surf简化版的结构,重新把ORB检测的代码给简化以下,发现虽然速度一样,确实能省好多行代码,关键是有 BruteForceMatcher<HammingLUT>matcher的帮 ...
- PHP检测用户名是否存在
reg.php <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www ...
- 01分数规划POJ3621(最优比例生成环)
Sightseeing Cows Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 8218 Accepted: 2756 ...
- Ini文件操作函数
/// <summary> /// Copies a string into the specified section of an initialization file. /// &l ...