search方法

  search 在一个字符串中搜索满足文本模式的字符串。语法格式如下:

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

  函数参数与 match 方法类似,如下表所示:

search函数参数说明
参数 描述
pattern 匹配的正则表达式
string 要匹配的字符串
flags 标志位,用于控制正则表达式的匹配方式,如:是否区分大小写、多行匹配等

【示例】search方法的使用

import re
m = re.match('abc', 'abcdefg')
print(m)
print(m.group())

  执行结果为 abc

match 与 search 的区别

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

匹配多个字符串

  search 方法搜索一个字符串,要想搜索多个字符串,如搜索 aa、bb 和 cc,最简单的方 法是在文本模式字符串中使用择一匹配符号(|)。择一匹配符号和逻辑或类似,只要满足 任何一个,就算匹配成功。

【示例】择一匹配符号(|)的使用

import re
s = 'aa|bb|cc'
#match进行匹配
m = re.match(s, 'aa')	#aa满足要求,匹配成功
print(m.group())
m = re.match(s, 'bb')	#bb满足要求,匹配成功
print(m.group())

#search查找
m = re.search(s, 'Where is cc')
print(m.group())

  执行结果为
hdfs正则匹配文件名 search正则表达式_字符串  从上面的代码可以看出,待匹配的字符串只要是 aa、bb 和 cc 中的任何一个就会匹配成 功。

【示例】匹配 1-100 之间所有的数字

import re
pattern = r'[1-9]$|[1-9]\d$|100$'
v = re.match(pattern, '0')
print(v)
v = re.match(pattern,'10')
print(v)
v = re.match(pattern,'100')
print(v)
v = re.match(pattern,'99')
print(v)
v = re.match(pattern,'200')
print(v)

  执行结果
hdfs正则匹配文件名 search正则表达式_正则表达式_02
  如果待匹配的字符串中,某些字符可以有多个选择,就需要使用字符集([]),也就是 一对中括号括起来的字符串。例如,[xyz]表示 x、y、z 三个字符可以取其中任何一个,相当 于“x|y|z”,所以对单个字符使用或关系时,字符集和择一匹配符的效果是一样的。

分组

  如果一个模式字符串中有用一对圆括号括起来的部分,那么这部分就会作为一组,可以 通过 group 方法的参数获取指定的组匹配的字符串。当然,如果模式字符串中没有任何用圆 括号括起来的部分,那么就不会对待匹配的字符串进行分组。

字符 功能
(ab) 将括号中的字符作为一个分组
\num 引用分组 num 匹配到的字符串
(?p) 分别起组名
(?p=name) 引用别名为 name 分组匹配到的字符串

【示例】匹配座机号码

import re
pattern = r'(\d+)-(\d{5,8}$)'
v = re.match(pattern, '010-66668888')
print(v)
print(v.group())
print(v.group(1))
print(v.group(1))
print(v.groups())
print(v.group()[0])
print(v.group()[1])

  执行结果
hdfs正则匹配文件名 search正则表达式_字符串_03
【示例】\num 的使用

import re
#匹配出网页标签内的数据
s = '<html><title>我是标题</title></html>'
#优化前
#pattern = r'<.+><.+>.+<.+><.+>'
#优化后 可以使用分组 \2 表示引用第2个分组 \1 表示引用第1个分组
pattern = r'<(.+)><(.+)>.+</\2></\1>'
v = re.match(pattern, s)
print(v)

  执行结果
hdfs正则匹配文件名 search正则表达式_字符串_04【示例】?P<要起的别名> (?P=起好的别名)

import re
s = '<html><h1>我是一号字体</h1></html>'
# pattern = r'<(.+)><(.+)>.+</\2></\1>' 
#如果分组比较多的话,数起来比较麻烦,可以使用起别名的方法?P<要起的名字> 以及使 用别名(?P=之前起的别名)
pattern = r'<(?P<html>.+)><(?P<h1>.+)>.+</(?P=html)></(?P=h1)>'
v = re.match(pattern, s)
print(v)

  执行结果
hdfs正则匹配文件名 search正则表达式_正则表达式_05  使用分组要了解如下几点:

  1. 只有圆括号括起来的部分才算一组,如果模式字符串中既有圆括号括起来的部分,也有没有被圆括号括起来的部分,那么只会将被圆括号括起来的部分算作一组,其 它的部分忽略。
  2. 用 group 方法获取指定组的值时,组从 1 开始,也就是说,group(1)获取第 1 组的 值,group(2)获取第 2 组的值,以此类推。
  3. groups 方法用于获取所有组的值,以元组形式返回。所以除了使用 group(1)获取第 1 组的值外,还可以使用 groups()[0]获取第 1 组的值。获取第 2 组以及其它组的值 的方式类似。