Python字符串的匹配和搜索
如果你想匹配或者搜索特定的字段的时候,如果你匹配的是相对比较简单的字符串的时候你只需要利用find()
、rfind()
、endswitch()
、startswitch()
等类似的方法即可,示例如下:
>>> info = "My host ip address is 10.0.1.10"
>>> info == 'ip'
False
>>> info.startswith('My')
True
>>> info.endswith('0')
True
>>> info.find('d')
12
对于复杂的匹配我们就要使用正则表了,那既然用到正则的话我们就得利用re
模块的方法了。为了解释正则表达式的基本使用,我们假设要匹配数字格式的字符串比如: 2018-06-27
,示例如下:
>>> date1 = '2018-06-27'
>>> date2 = '2018-06-nock'
>>> import re
>>> # 简单匹配:d+表示匹配一个或多个数字
>>> print('match yes') if re.match(r'd+-d+-d+', date1) else print('match no')
match yes
>>> print('match yes') if re.match(r'd+-d+-d+', date2) else print('match no')
match no
如果你想使用同一个模式去做多次匹配,那你应该先将模式字符串预先编译为模式对象,然后再去做匹配,示例如下:
>>> import re
>>> matchObject = re.compile(r'd+/d+/d+')
>>> text = '07/08/2018'
>>> print('match yes') if matchObject.match(text) else print('match failed')
match yes
>>> print(matchObject.match(text))
<_sre.SRE_Match object; span=(0, 10), match='07/08/2018'>>>> text = 'Today is 07/08/2018, PyCon starts 03/13/2013'
>>> print('match yes') if matchObject.match(text) else print('match failed')
match failed
>>> print(matchObject.match(text)) # 默认返回空
None
match()
方法的查找是从头开始去做完全匹配的,如果你想查找到字符串任意位置出现的匹配模式,并且希望得到结果,你可以使用findall()
去替代,示例如下:
>>> import re
>>> text = 'Today is 07/08/2018, PyCon starts 03/13/2013'
>>> matchObject = re.compile(r'd+/d+/d+')
>>> matchObject.findall(text)
['07/08/2018', '03/13/2013']
>>>
如上所示就把字符串中,你要的结果都找到了,并且默认输出是一个列表,如果没有匹配到任何内容,默认返回一个空列表。
在定义正则的时候,通常会利用括号去做捕获分组,比如:
matchObjec = = re.compile(r'(d+)/(d+)/(d+)')
捕获分组之后可以使得后面的处理更加简单,因为可以分别将每个组的内容提取出来,示例如下:
>>> matchObject = re.compile(r'(d+)/(d+)/(d+)')
>>> m = matchObject.match('10/08/2018')
>>> m.group(0)
'10/08/2018'
>>> m.group(1)
'10'
>>> m.group(2)
'08'
>>> m.group(3)
'2018'
>>> m.groups()
('10', '08', '2018')
>>> month, day, year = m.groups()
>>> print(month, day, year)
10 08 2018>>> # 查找所有匹配项
>>> text = 'Today is 07/08/2018, PyCon starts 03/13/2013'
>>> matchObject = re.compile(r'(d+)/(d+)/(d+)')
>>> matchObject.findall(text)
[('07', '08', '2018'), ('03', '13', '2013')]
>>> for month, day, year in matchObject.findall(text):
... print('{}-{}-{}'.format(year, month, day))
...
...
2018-07-08
2013-03-13
findall()
方法会搜索文本并以列表形式返回所有的匹配。 如果你想以迭代方式返回匹配,可以使用 finditer()
方法来代替,比如:
>>> text = 'Today is 07/08/2018, PyCon starts 03/13/2013'
>>> matchObject = re.compile(r'(d+)/(d+)/(d+)')
>>> for m in matchObject.finditer(text):
... print(m.groups())
...
...
('07', '08', '2018')
('03', '13', '2013')
>>> for m in matchObject.finditer(text):
... print(m.group())
...
...
07/08/2018
03/13/2013
总结
上面主要讲解了一下利用re
模块进行字符串的匹配和搜索的基本用法,核心方法就是先使用re.compile()
编译你想匹配的正则表达式字符串内容,然后再使用match()
,findall()
和finditer()
方法的结合使用。
当你编写正则表达式的时候,低昂对普通的做法是使用原始字符串,比如: r'(d+)/(d+)/(d+)'
。这种字符串将不去解析反斜杠,这在正则表达式中是很有用的。 如果不这样做的话,你必须使用两个反斜杠,类似 '(\d+)/(\d+)/(\d+)'
。
需要注意的是match()
方法仅仅检查字符串的开始部分。它的匹配结果有可能并不是你期望的那样精确,如果你想精确匹配,确保你的正则表达式以$结尾,就像这么这样:
>>> m = matchObject.match('10/08/2018abcd')
>>> m
<_sre.SRE_Match object; span=(0, 10), match='10/08/2018'>
>>> m.group()
'10/08/2018'>>> matchObject = re.compile(r'(d+)/(d+)/(d+)$')
>>> m = matchObject.match('10/08/2018abcd')
>>> print(type(m))
<class 'NoneType'>
>>> m = matchObject.match('10/08/2018')
>>> print(type(m))
<class '_sre.SRE_Match'>
>>> m.group()
'10/08/2018'
最后,如果你仅仅是做一次简单的文本匹配/搜索操作的话,可以略过编译部分,直接使用 re 模块级别的函数。比如:
>>> text = 'Today is 07/08/2018, PyCon starts 03/13/2013'
>>> re.findall(r'(d+)/(d+)/(d+)', text)
[('07', '08', '2018'), ('03', '13', '2013')]
但是需要注意的是,如果你打算做大量的匹配和搜索操作的话,最好先编译正则表达式,然后再重复使用它。 模块级别的函数会将最近编译过的模式缓存起来,因此并不会消耗太多的性能, 但是如果使用预编译模式的话,你将会减少查找和一些额外的处理损耗。
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Maven快速入门
- TomCat安装及快速部署
- SpringCloud+MyBatis分页处理(前后端分离)
- 手把手教你搭建SpringCloud项目
- SpringCloud的@Value注解及GitLab配置使用
- 使用 cdk8s 与 Argo CD 进行 GitOps 实践
- 设计模式 | 模版方法
- Python 函数3000字使用总结
- 3D摇杆控制器一种简单实现!Cocos Creator 3D!
- 数据结构 | TencentOS-tiny中队列、环形队列、优先级队列的实现及使用
- RTOS内功修炼记(六)—— 任务间通信为什么不用全局变量?
- 程序员必备基础:加签验签
- 【Rust日报】2020-07-16 j4rs,一个在 Rust 中调用 Java 代码的 Crate
- Vue.js 3 正式进入 RC 阶段
- FeignClient注解及参数问题---SpringCloud微服务