Python re库match(),serach(),findall()和finditer()方法使用

之前整理过一篇关于正则表达式基本语法的文章,详见正则表达式。这篇博客将介绍python中re库的使用,主要涉及match(),search(),findall()和finditer()方法的使用。
在使用re库之前,首先需要引入re库

import re

一个正则表达式与普通字符串没有任何区别,只有经过re库编译才能代表满足该特征的一组字符串。因此如果字符串中包含反斜杠+特殊字符,Python解释器会将其进行转义。例如:”\b“会被解释成”退格“。所以在使用含有反斜杠的正则表达式时,应该告诉解释器不要转义字符串里面的符号,而是直接传递给re库处理。在Python中在字符串前加上前缀”r“表明这是一个原生字符串,这样Python解释器将不再对其进行解释。通常,在书写正则表达式时,采用r’…’是一个良好的习惯。

1、search()方法

在字符串中搜索匹配正则表达式的第一个位置,返回match对象。

re.search(pattern, string, flags=0)
pattern:正则表达式
string:待匹配的字符串
flags:正则表达式使用控制标记
    re.I:忽略正则表达式中的大小写,比如:[A-Z]也能够匹配小写的a-z
    re.M:正则表达式中^操作符能够将字符串每行当作匹配开始
    re.S:正则表达式中.操作符能够匹配所有字符,默认情况下.不能匹配换行
import re
match = re.search(r"\w+", "Hello World")    # match对象
if match:
    print(match.group(0))

以上示例代码将输出Hello,match对象将在后面介绍。

2、match()方法

从字符串的开始位置开始匹配正则表达式,返回match对象。

import re
match = re.match(r"[1-9]\d{5}", "HHU 211100")
if match:
    print(match.group(0))

以上示例代码将不会返回任何匹配串,因为match()方法是从字符串开始位置开始匹配,将不会得到任何匹配结果。再调用返回结果之前,判断是否为空是一个很好的习惯。

3、findall()方法

Return all non-overlapping matches of pattern in string, as a list of strings.
搜索字符串,以列表形式返回所有匹配的子串。

import re
ls = re.findall(r"[0-9]\d{5}", "HHU 211100 HHU211000")
print(ls)

以上示例代码将输出211100 211000,可见findall()将全部匹配的结果都保存到了list中。

4、finditer()方法

搜索字符串,返回一个匹配结果的迭代类型,每个迭代元素是match对象。因此可以通过循环,对每一个匹配子串进行操作。

import re
for m in re.finditer(r"[0-9]\d{5}", "HHU211100 HHU211000"):
    if m:
        print(m.group(0))

以上代码将迭代输出匹配的结果。
以上都是采用函数式调用方法,也可以采用面向对象方法,先对正则表达式进行编译,然后就可以多次操作了。

import re
regex= re.compile(r"[0-9]\d{5}")
result = regex.search("HHU 211100")

5、match对象

match对象包含了一次匹配的结果。
match对象包含以下属性和方法

# 属性
.string:待匹配字符串
.re:匹配时使用的正则表达式对象
.pos:正则表达式搜索文本开始的位置
.endpos:正则表达式搜索文本的结束位置
# 方法
group():获得匹配后的字符串
start():匹配字符串在原始字符串中的起始位置
end():匹配字符串在原始字符串中的结束位置
.span():将匹配字符串在原始字符串中的起始位置和结束位置以元组的形式返回

6、使用注意点

1、所有方法都采用贪婪匹配,即返回所有匹配成功的最长的那个子串。
2、findall()方法

import re
# 下面正则表达式用来匹配所有的单词包括缩写和连词
ls = re.findall(r"\w+([-']\w+)*", "graph-based state-of-the-art it's")
print(ls)
# 输出["-based", "-art", "'s"]

ls = re.findall(r"(\w+([-']\w+)*)", "graph-based state-of-the-art it's")
print(ls)
# 输出[('graph-based', '-based'), ('state-of-the-art', '-art'), ("it's", "'s")]

ls = re.findall(r"[0-9]\d{5}", "HHU 211100 HHU211000")
print(ls)
#输出["211100", "211000"]

第一个例子中正则表达式带有1个括号,其输出的内容就是括号内的正则表达式匹配到的内容,而不是整个表达式所匹配到的结果。
第二个例子中正则表达式带有2个括号,我们可以看到其输出的list中每个元素是一个包含2个元素的tuple,其中tuple的第一个元素是最外层()也就是整个表达式匹配的结果,第二个元素是里面()匹配的结果。
第三个例子中正则表达式不带有括号,其输出的内容就是整个表达式所匹配到的内容。
结论:findall()返回的是括号内的正则表达式所匹配到的结果,多个括号就会返回多个括号分别匹配到的结果,如果没有括号就返回就返回整个正则表达式所匹配到的结果。

猜你喜欢

转载自blog.csdn.net/hohaizx/article/details/79403411