问题:请说明以下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!!")