1.findall()函数

findall函数返回的是正则表达式在字符串中所有匹配结果的列表

我们先来看一组例子,来了解这个方法在返回匹配结果的细节。

import re
s = "abc defg hi jkl mnopq rst xyz"
regex_str_1 = "((\w+)\s+(\w+))"
res_1 = re.findall(regex_str_1,s)
print(res_1)

regex_str_2 = "(\w+)\s+\w+"
res_2 = re.findall(regex_str_2,s)
print(res_2)

regex_str_3 = "\w+\s+\w+"
res_3 = re.findall(regex_str_3,s)
print(res_3)

返回的结果如下:

res_1:
    [('abc defg', 'abc', 'defg'), ('hi jkl', 'hi', 'jkl'), ('mnopq rst', 'mnopq', 'rst')]
res_2:
    ['abc', 'hi', 'mnopq']
res_3:
    ['abc defg', 'hi jkl', 'mnopq rst']

首先我们从简单的入手,就来看看res_3的运行结果。

这个正则表达式中不包含任何括号,那么返回的将是字符串中匹配到的所有结果。正则表达式"\w+\s+\w+"匹配的结果的格式如下:A  B。我们发现字符串中有三个子字符串满足这样的要求。即:'abc defg', 'hi jkl', 'mnopq rst'。

有了以上的基础,我们再来看下比较麻烦的res_2的运行结果。

如果一个正则表达式中含有(),那么返回的匹配的结果是在整个字符串匹配的基础上返回括号中匹配的子字符串。比如说,我们的正则表达式是"\(w+)\s+\w+"。我们首先来看"\w+\s+\w+"匹配到的结果,也就是:'abc defg', 'hi jkl', 'mnopq rst'。在这个基础上,因为我们的正则表达式是为了返回括号中匹配到的内容。所以,我们的结果返回的内容是:'abc', 'hi', 'mnopq'。

在res_2的基础上,我们再看看res_1的返回结果就很简单了。当给出的正则表达式中带有多个括号时,返回的匹配内容中的元素为多个字符串组成的tuple。这个tuple中字符串个数与括号对数相同,字符串内容与每个括号内的正则表达式相对应,并且排放顺序是按括号出现的顺序。我们发现这个正则表达式中包含了三个括号:"((\w+)\s+\w+)",毫不意外的,返回的列表元素的格式如下:(A,B,C)。A代表的是最外层括号对应的内容,B代表的是内部左边第一个括号对应的内容,C也就是内部右边的那个括号对应的内容。那么,这个正则表示返回的内容就是这样子的:[('abc defg', 'abc', 'defg'), ('hi jkl', 'hi', 'jkl'), ('mnopq rst', 'mnopq', 'rst')]。

 

2.match()函数

match()函数只会从字符串的开始与正则表达式匹配,匹配成功返回将返回match object,否则返回none。

我们从代码可是分析。

import re

line = "aa<div>test1</div>bb<div>test2</div>cc"
regex_str1 = ".*(<div>.*</div>).*"
regex_str2 = "<div>.*</div>"

match_obj_1 = re.match(regex_str1,line)
if match_obj_1:
    print(match_obj_1.group(0))
    print(match_obj_1.group(1))

match_obj_2 = re.match(regex_str2,line)
if match_obj_2:
    print(match_obj_2.group(0))
else:
    print("Can not match")

我们来看下各自运行的结果:

re.match(regex_str1,line).group(0):
    aa<div>test1</div>bb<div>test2</div>cc
re.match(regex_str1,line).group(1):
    <div>test2</div>
match_obj_2 = re.match(regex_str2,line):
    Can not match

我们来依次分析运行结果:

match如果匹配成功将会返回match object,我们可以调用group()方法进行获取。当使用group(0)来获取内容的时候,将会返回的是正则表达式中不包含括号所匹配到的内容。即将根据".*<div>.*</div>.*"来匹配到的内容,匹配的结果如下:aa<div>test1</div>bb<div>test2</div>cc。当然,如果group(1)来获取内容的时候,将会在不包含括号的进行匹配的基础上获取括号中的匹配到的内容。在该例子中,我们匹配到不包含括号的内容是aa<div>test1</div>bb<div>test2</div>cc,然后我们根据是否是贪婪模式(此处是贪婪模式)来获取括号中匹配到的内容,即:<div>test2</div>。

另外,match()函数只会从字符串的开始与正则表达式匹配,匹配成功返回将返回match object,否则返回none。对于,"<div>.*</div>"正则表达式中,我们将会查看字符串line = "aa<div>test1</div>bb<div>test2</div>cc"是否是从<div>开头的,显然不是,那么也就意味着我们没有匹配到内容,返回None。