匹配或者搜索特定模式的文本

匹配的是字面字符串,那么你通常只需要调用基本字符串方法就行, 比如 str.find() , str.endswith() , str.startswith() 或者类似的方法:

>>> text = 'yeah, but no, but yeah, but no, but yeah'
>>> # Exact match
>>> text == 'yeah'
False
>>> # Match at start or end
>>> text.startswith('yeah')
True
>>> text.endswith('no')
False
>>> # Search for the location of the first occurrence
>>> text.find('no')
10

对于复杂的匹配需要使用正则表达式和 re 模块。 为了解释正则表达式的基本原理,假设你想匹配数字格式的日期字符串比如 11/27/2012 ,你可以这样做:

>>> text1 = '11/27/2012'
>>> text2 = 'Nov 27, 2012'
>>>
>>> import re
>>> # Simple matching: \d+ means match one or more digits
>>> 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

使用同一个模式去做多次匹配,你应该先将模式字符串预编译为模式对象。比如:

>>> datepat = re.compile(r'\d+/\d+/\d+')
>>> if datepat.match(text1):
... print('yes')
... else:
... print('no')
...
yes
>>> if datepat.match(text2):
... print('yes')
... else:
... print('no')
...
no

match() 总是从字符串开始去匹配,如果你想查找字符串任意部分的模式出现位置, 使用 findall() 方法去代替。比如:

>>> text = 'Today is 11/27/2012. PyCon starts 3/13/2013.'
>>> datepat.findall(text)
['11/27/2012', '3/13/2013']

在定义正则式的时候,通常会利用括号去捕获分组。比如:

>>> datepat = re.compile(r'(\d+)/(\d+)/(\d+)')

捕获分组可以使得后面的处理更加简单,因为可以分别将每个组的内容提取出来。比如:

>>> m = datepat.match('11/27/2012')
>>> m
<_sre.SRE_Match object at 0x1005d2750>
>>> # Extract the contents of each group
>>> m.group(0)
'11/27/2012'
>>> m.group(1)
'11'
>>> m.group(2)
'27'
>>> m.group(3)
'2012'
>>> m.groups()
('11', '27', '2012')
>>> month, day, year = m.groups()
>>>
>>> # Find all matches (notice splitting into tuples)
>>> text
'Today is 11/27/2012. PyCon starts 3/13/2013.'
>>> datepat.findall(text)
[('11', '27', '2012'), ('3', '13', '2013')]
>>> for month, day, year in datepat.findall(text):
... print('{}-{}-{}'.format(year, month, day))
...
2012-11-27
2013-3-13

findall() 方法会搜索文本并以列表形式返回所有的匹配。 如果你想以迭代方式返回匹配,可以使用 finditer() 方法来代替,比如:

>>> for m in datepat.finditer(text):
... print(m.groups())
...
('11', '27', '2012')
('3', '13', '2013')

Python实战从入门到精通第九讲——字符串与文本3之字符串匹配和搜索相关推荐

  1. Python实战从入门到精通第二讲——类

    1. 类的创建 class Student:student_Count = 0def __init__(self, name, age):self.name = nameself.age = ageS ...

  2. 【Python】Python实战从入门到精通之四 -- 教你使用Python中字典

    本文是Python实战–从入门到精通系列的第四篇文章: Python实战从入门到精通第一讲–Python中的变量和数据类型 Python实战从入门到精通第二讲–Python中列表操作详解 Python ...

  3. 【Python】Python实战从入门到精通之三 -- 教你使用Python中条件语句

    本文是Python实战–从入门到精通系列的第三篇文章: Python实战从入门到精通第1讲–Python中的变量和数据类型 Python实战从入门到精通第2讲–Python中列表操作详解 Python ...

  4. 【Python】Python实战从入门到精通之七 -- 教你深入理解异常处理

    本文是<Python实战从入门到精通>系列之第7篇 [Python]Python实战从入门到精通之一 -- 教你深入理解Python中的变量和数据类型 [Python]Python实战从入 ...

  5. 【Python】Python实战从入门到精通之六 -- 教你读取文件

    本文是<Python实战从入门到精通>系列之第6篇 [Python]Python实战从入门到精通之一 -- 教你深入理解Python中的变量和数据类型 [Python]Python实战从入 ...

  6. 【Python】Python实战从入门到精通之五 -- 教你使用文件写入

    本文是<Python实战从入门到精通>系列之第5篇 [Python]Python实战从入门到精通之一 -- 教你深入理解Python中的变量和数据类型 [Python]Python实战从入 ...

  7. 【Python】Python实战从入门到精通之一 -- 教你深入理解Python中的变量和数据类型

    本文是Python实战–从入门到精通系列的第一篇文章: Python实战从入门到精通之一 – 教你深入理解Python中的变量和数据类型 文章目录 1.变量 1.1 变量命名规则 1.2 变量名称错误 ...

  8. Python实战从入门到精通第二十讲——调用父类方法

    在子类中调用父类的某个已经被覆盖的方法. 为了调用父类(超类)的一个方法,可以使用 super() 函数,比如: class A:def spam(self):print('A.spam')class ...

  9. Python实战从入门到精通第十九讲——自定义字符串的格式化

    通过 format() 函数和字符串方法使得一个对象能支持自定义的格式化. 为了自定义字符串的格式化,我们需要在类上面定义 __format__() 方法.例如: _formats = {'ymd' ...

最新文章

  1. lzw编码过程详解_编码拓展——封装、编码、码率
  2. C语言实验——打印数字图形(JAVA)
  3. 电影短视频营销白皮书
  4. Myeclipse编译工程用Weblogic发布的时候jdk版本问题
  5. phalapi-进阶篇1(Api,Domain,和Model)
  6. 微软将所有的Windows代码库迁移到Git
  7. json标准格式举例_JSON格式简介及一些对应函数
  8. 【手写字母识别】基于matlab GUI模板匹配手写大写字母识别【含Matlab源码 115期】
  9. 自动驾驶3-3 自动驾驶的安全框架 Safety Frameworks for Self-Driving
  10. 【项目篇-软件项目技术方案怎么写?(五千字图文总结建议)】软件平台类创新创业竞赛项目计划书、新苗国创(大创)申报书
  11. MOEA/D-RDG 2016 阅读笔记
  12. pxhere - 世界知名的免费摄影图库,可以免费商用
  13. netcfg 进程分析
  14. vivo8.0系统机器最完美激活xposed框架的方法
  15. WINVNC源码分析(四)-vnchooks
  16. 什么?你居然不会微信分身
  17. 在VC中编程实现按钮的启用(enable)和禁用(disable)
  18. Linux杂谈之jq命令
  19. 区块链技术的安全价值与局限性解析
  20. Android切词工具——BreakIterator(2)

热门文章

  1. Filecoin网络目前总质押量约为4110万枚FIL
  2. 未来金融科技宣布已完成mBTC系统和技术升级,消费者可用比特币进行在线支付
  3. 赛锐信息:基于SAP ERP系统的企业内部审计介绍
  4. 用户数据销售额分析动态大屏看板+大屏数据可视化图表组件(折线图+圆柱图+散点图+饼图+漏斗图+雷达图+水位图)+智能web端高保真大数据动态可视化大屏看板+中国动态地图+智慧电商实时动态数据大屏看板
  5. py库: GUI(tkinter)
  6. notepad++,vim驼峰命名与下划线的互相转换
  7. BZOJ 1070: [SCOI2007]修车
  8. 推荐sqlLite管理工具.
  9. 创业思考:做生意不是靠学历
  10. 微信开发 调用摄像机拍照(录像)功能