re中的match和search有什么区别?

本文详细介绍了Python re模块中match和search的区别。re.match()仅匹配字符串开头,若不符则返回None;而re.search()扫描整个字符串,返回首个成功匹配的结果。文章通过示例展示了如何使用span()和group()获取匹配内容,以及如何利用flag参数控制匹配模式。
摘要由CSDN通过智能技术生成

问题:请说明以下re模块中的match和search有什么区别?

re.match()与re.search()的区别

re.match()只匹配字符串的开始,如果字符串开始不符合正则表达式,则匹配失败,结果返回None,而re.search()匹配整个字符串,直到找到一个匹配 


re.search()

re.search()扫描整个字符串并返回第一个成功的匹配结果,如果匹配成功,re.search()将返回一个匹配的对象,否则返回None

语法格式

re.search(pattern, string, flags=0)

参数说明

pattern:匹配的正则表达式

string:要匹配的字符串

flags:标志位(可选参数),用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等,其具体参数为:

        1.re.I   使匹配对大小写不敏感

        2.re.L  表示特殊字符集 \w, \W, \b, \B, \s, \S 依赖于当前环境,做本地化识别(locale-aware)匹配

        3.re.M  多行匹配,影响 ^ 和 $

        4.re.S   使 . 匹配包括换行在内的所有字符

        5.re.U   根据Unicode字符集解析字符,这个标志影响 \w, \W, \b, \B

        6.re.X   为了增加可读性,忽略空格和 # 后面的注释

示例1

import re
text = "abcabcabc"
res = re.search("c", text)
# <_sre.SRE_Match object; span=(2, 3), match='c'>
print(res)

从上述结果我们可以看到span(2, 3) 这个应该是对应的匹配结果的下标,匹配的内容是c

如果想获取匹配到结果的下标,我们可以使用span(),如果想获取匹配到结果的内容,我们可以使用group()

# (2, 3)
re.search("c", text).span()
# 'c'
re.search("c", text).group()
import re
# 在起始位置匹配
print(re.search('www', 'www.csdn.net').span())  # (0, 3)
# 不在起始位置匹配
print(re.search('net', 'www.csdn.net').span())  # (9, 12)

示例2

import re
text = "abc123abc"
res = re.search("\d+", text)
print(res.group())  # 123

示例3:使用标志位flag忽略匹配的大小写 

import re
text = "abc123abc"
res = re.search("A", text, re.I)
print(res.span())  # (0, 1)
print(res.group())  # a

示例4

import re
text = "abc123def"
rex_compile = re.compile("([a-z]*)([0-9]*)([a-z]*)")
res = rex_compile.search(text)

print(res.group())  # abc123def
# group()和group(0)作用效果一样匹配的是整体
print(res.group(0))  # abc123def
# 匹配第一个小括号的内容
print(res.group(1))  # abc
# 匹配第二个小括号的内容
print(res.group(2))  # 123
# 匹配第三个小括号的内容
print(res.group(3))  # def

re.match()

re.match()从字符串的起始位置开始往后查找,返回第一个符合匹配模式规则的对象,如果起始位置不符合匹配模式,re.match()则返回None

语法格式

re.match(pattern, string, flags=0)

参数说明

pattern:匹配的正则表达式

string:要匹配的字符串

flags:标志位(可选参数),用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等,其具体参数为:

        1.re.I   使匹配对大小写不敏感

        2.re.L  表示特殊字符集 \w, \W, \b, \B, \s, \S 依赖于当前环境,做本地化识别(locale-aware)匹配

        3.re.M  多行匹配,影响 ^ 和 $

        4.re.S   使 . 匹配包括换行在内的所有字符

        5.re.U   根据Unicode字符集解析字符,这个标志影响 \w, \W, \b, \B

        6.re.X   为了增加可读性,忽略空格和 # 后面的注释

示例1 

import re
text = "Python is a good language"
pattern = "Python"  
result = re.match(pattern, text)
# <_sre.SRE_Match object; span=(0, 6), match='Python'>
print(result)

可以看到匹配的下标是(0,6) 匹配的内容是Python 

如果想获取匹配到结果的下标,我们可以使用span(),如果想获取匹配到结果的内容,我们可以使用group()

# (0, 6)
re.match(pattern, text).span()
# 'Python'
re.match(pattern, text).group()
import re
text = "Python Python is a good language Python"
pattern = "Python"

res = re.match(pattern, text)
print(res.span())  # (0, 6)
print(res.group())  # Python

示例2:匹配不到内容的情况

import re
text = "Python is a good language"
pattern1 = "python"
pattern2 = "a"
pattern3 = "language"

res1 = re.match(pattern1, text)
print(res1)  # None

# 不在起始位置匹配
res2 = re.match(pattern2, text)
print(res2)  # None

# 不在起始位置匹配
res3 = re.match(pattern3, text)
print(res3)  # None

提示Tips

当匹配不到内容的时候就使用group()或者span()的时候会报错,所以当使用group()或者span()的时候,先判断下是否匹配到内容然后再使用它

# AttributeError: 'NoneType' object has no attribute 'span'
res1.span()
# AttributeError: 'NoneType' object has no attribute 'group'
res1.group()
import re
text = "Python is a good language"
pattern = "language"

res = re.match(pattern, text)
print(res)  # None

if res:
    print(res.group())
else:
    print("没有匹配到内容")

示例3:使用flag参数控制正则表达式的匹配方式

正则表达式可以包含一些可选标志修饰符来控制匹配的模式

修饰符被指定为一个可选的标志,多个标志可以通过按位OR( | )来指定

re.I   使匹配对大小写不敏感

re.L  表示特殊字符集 \w, \W, \b, \B, \s, \S 依赖于当前环境,做本地化识别(locale-aware)匹配

re.M  多行匹配,影响 ^ 和 $

re.S  使 . 匹配包括换行在内的所有字符

re.U  根据Unicode字符集解析字符,这个标志影响 \w, \W, \b, \B

re.X  为了增加可读性,忽略空格和 # 后面的注释

# 不区分大小写
import re
text = "Python is a good language"
pattern = "python"
res = re.match(pattern, text, re.I)
print(res.group())  # Python
import re
line = "Cats are smarter than dogs"
matchObj = re.match(r'(.*) are (.*?) .*', line, re.M|re.I)

'''
matchObj.group(): Cats are smarter than dogs
matchObj.group(1): Cats
matchObj.group(2): smarter
'''
if matchObj:
   print("matchObj.group():", matchObj.group())
   print("matchObj.group(1):", matchObj.group(1))
   print("matchObj.group(2):", matchObj.group(2))
else:
   print("No match!!")
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值