美文网首页python学习
re模块的match和search的区别

re模块的match和search的区别

作者: 莫辜负自己的一世韶光 | 来源:发表于2018-11-22 19:56 被阅读129次

正则表达式

首先正则表达式和python没有任何的关系,是匹配字符串的一种规则

官方定义:正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑。

正则,就只和字符串相关了.

字符组: [字符组]

在同一个位置可能出现的各种字符组成的一个字符组,在正则表达式中用[]表示.
[]表示的是一个范围,里面相当于要匹配的数据集.

正则 待匹配字符 匹配结果 说明
[0123456789] 8 True 8在字符集中,所以可以匹配到
[0-9] 7 True 可以用-表示范围
[a-z] s True 可以匹配所有的小写字母
[0-9a-zA-Z] a True 可以匹配字母和数字

特殊意义的元字符

元字符 匹配内容
. 匹配除换行符以外的任意字符
\w 匹配字母或数字或下划线
\s 匹配任意的空白字符
\d 匹配数字
\n 匹配一个换行符
\t 匹配一个制表符
\b 匹配一个单词的结尾
^ 匹配字符串的开始
$ 匹配字符串的结尾
\W 匹配非字母或数字或下划线
\D 匹配非数字
\S 匹配非空白符
a b 匹配字符a或字符b
() 匹配括号内的表达式,也表示一个组
[...] 匹配字符组中的字符
[^...] 匹配除了字符组中的字符的所有字符

量词:

量词 用法
* 重复0此或多次
+ 重复一次或多次
? 重复0次或1次
{n} 重复n次
{n,} 重复n次或更多次
{m,n} 重复m到n次

. ^ $

正则 待匹配字符 匹配结果 说明
海. 海燕海角海东 海燕海角海东 匹配所有的"海." 的字符
^海. 海燕海角海东 海燕 只匹配字符串开头的海字开头的
海.$ 海燕海娇海东 海东 只匹配结尾的"海.$"

几个常用的非贪婪匹配Pattern

*? 重复任意次,但尽可能少重复
+? 重复1次或更多次,但尽可能少重复
?? 重复0次或1次,但尽可能少重复
{n,m}? 重复n到m次,但尽可能少重复
{n,}? 重复n次以上,但尽可能少重复

.*?的用法

. 是任意字符
* 是取 0 至 无限长度
? 是非贪婪模式。
何在一起就是 取尽量少的任意字符,一般不会这么单独写,他大多用在:
.*?x

就是取前面任意长度的字符,直到一个x出现

findall match search的区别?

  • findall

在string中进行搜索查找所有的匹配成功的组,即用括号括起来的部分.返回list对象,每个list item是由每个匹配的所有组组成的list

  • search

在string中全局进行搜索,成功返回Match object.可以通过group得到结果,失败返回None

  • match

匹配string的开头,成功返回Match object.可以通过group得到结果,失败返回None.

# encoding:utf-8
__author__ = 'Fioman'
__date__ = '2018/11/20 14:17'
import re

# findall 返回一个所有的满足匹配条件的一个列表
# search
# match
# 返回所有满足匹配条件的内容,放到列表中
ret = re.findall('[a-z]+', 'eva egon yuan')
print(ret)

# 从前往后,找到一个就返回,返回的是一个对象,需要调用group()才能找到结果
# 如果找不返回None,这个时候调用group会报错.这种情况下,最好用if判断一哈
# 再group

ret1 = re.search('a', 'eva egon yuan')
if ret1:
    print(ret1.group())


# match和search的用法一样.但是match是从头开始匹配,如果正则规则从头开始可以
# 匹配上,就返回一个变量.匹配的内容需要用gorup才能显示.如果没有匹配上,就返回None
# 调用group会报错.match表示的是从字符串起始处就要匹配上才可以.

print('*' * 20)
ret2 = re.match('eg', 'eva egon yuan')
print(ret2)
if ret2:
    print(ret2.group())
  • split
ret = re.split('[ab]', 'abcd')
# 先按'a'分割得到''和'bcd',在对''和'bcd'分别按'b'分割
print(ret)  # ['', '', 'cd']
  • sub
ret = re.sub('\d', 'H', 'eva3egon4yuan4',1)
# 将数字替换成'H',参数1表示只替换1个
print(ret) #evaHegon4yuan4
  • compile
obj = re.compile('\d{3}')
#将正则表达式编译成为一个 正则表达式对象,规则要匹配的是3个数字
ret = obj.search('abc123eeee') #正则表达式对象调用search,参数为待匹配的字符串
print(ret.group())
ret = obj.search('abcashgjgsdghkash456eeee3wr2') #正则表达式对象调用search,参数为待匹配的字符串
print(ret.group())  #结果 : 123

import re
ret = re.finditer('\d', 'ds3sy4784a')   #finditer返回一个存放匹配结果的迭代器
print(ret)  # <callable_iterator object at 0x10195f940>
# print(next(ret).group())  #查看第一个结果
# print(next(ret).group())  #查看第二个结果
# print([i.group() for i in ret])  #查看剩余的左右结果
for i in ret:
    print(i.group())

相关文章

网友评论

    本文标题:re模块的match和search的区别

    本文链接:https://www.haomeiwen.com/subject/yemtqqtx.html