前言
昨天学的还是比较简单的,今天学模块一下难度就上去了,反复实验,才感觉理解了,如果有错误,希望大佬批评指正。
一、search函数的使用方法
search函数用于搜索字符串,当遇到第一个满足条件的子串时就会返回。search包含三个参数,分别是pattern、string、flags,分别表示用于匹配的正则表达式、待处理的原字符串、标志位,用于指定在查找过程中是否处理大小写。search返回的结果必须用group()方法查看结果。我们先来看看代码:
import re string = 'Hello Word,hello Python,hello r' p = r"^(hello) (\w+),(\w+) (\w+),(\w+) r$" data = re.search(p,string,re.I) print('获取到匹配字符:',data.group()) print('所有匹配的组:',data.groups()) print('获取第二组的值:',data.group(2))
二、遇到的问题和个人理解
说明几点我理解的情况和遇到的问题:
- 该正则表达式p的意思是hello开头,r结尾,中间是任意字符,其实就是对应我们输入的字符串。
- 根据1,所以我们search函数获取到的字符串是全部的string,re.I是不区分大小写。
- 在这里我首先遇到的难理解部分就是所有匹配的组,也就是groups()方法返回的列表有5个元素,我一开始以为p会按照逗号进行隔开,按照三种不同的表达式进行匹配,按照满足条件即返回原则,那么返回的内容应该为(‘hello word’,’hello word’,’hello r’),所有匹配的组应该是三个,但事实上是5个。最后我的理解是字符串和表达式是一个整体,我们不能以逗号为分隔符将他们分开看。还遇到一个问题是^(hello)以hello开头,hello是被匹配到的,并且放在第一组,以r结尾,r也是被匹配到的,但是r没有放在最后一组,r并没有输出,我的理解是当表达式被分组以后,只会匹配子表达式输出,非子表达式不会输出。(这个地方不知道理解的对不对)
下面看输出结果:
获取到匹配字符: Hello Word,hello Python,hello r
所有匹配的组: ('Hello', 'Word', 'hello', 'Python', 'hello')
获取第二组的值: Word
可以看到,字符整体是符合正则表达式的,所以被匹配到。所有被匹配的组都是满足子表达式的,r不在分组里,所以没有输出。为此我添加了一行代码进行实验。
print(re.findall('\w+ r$',string))
此代码输出结果为['hello r'],可以看到hello和r均输出,如果改成print(re.findall('(\w+) r$',string)),输出结果为['hello'],r没有输出。如果改成print(re.findall('(\w)+ (r)$',string)),那么输出结果又变为[('hello', 'r')],r作为分组进行输出。由此可见,分组之后,只会返回分组的内容,未被分组的不会返回。
总结
search()函数是Python中re模块提供的一个用于在字符串中查找匹配正则表达式的子串的函数。它的语法如下:
re.search(pattern, string, flags=0)
其中,参数含义如下:
- pattern:要查找的正则表达式。
- string:要在其中查找匹配项的字符串。
- flags:可选参数,用于控制正则表达式的匹配方式。常用的标志包括:
- re.IGNORECASE:忽略大小写。
- re.MULTILINE:多行模式,支持""^"和"$"匹配每一行的开头和结尾。
- re.DOTALL:使"."匹配包括换行符在内的所有字符。
- re.VERBOSE:详细模式,可以添加注释来描述正则表达式。
search()函数返回一个匹配对象,如果没有找到匹配项,则返回None。可以使用匹配对象的方法和属性获取匹配项的信息,例如:
- group():返回整个匹配项。
- start():返回匹配项在字符串中的起始位置。
- end():返回匹配项在字符串中的结束位置。
- span():返回一个元组,包含匹配项在字符串中的起始位置和结束位置。
- groups():返回一个包含所有捕获组的元组。
- groupdict():返回一个字典,包含所有命名捕获组及其对应的值。
- regex.compile(pattern).findall(string):将正则表达式编译成Pattern对象后,使用findall()方法查找所有匹配项。