本文讲解正则表达式常用的几大函数方法:

方法

使用格式

讲解

match

match(string, pos=0, endpos=-1)

方法用于查找字符串的头部,它只要找到了一个匹配的结果就返回

search

search(string, pos=0, endpos=-1)

方法用于查找字符串的任何位置,它只要找到一个匹配的结果就返回

findall

findall(string, pos=0, endpos=-1)

方法返回所有匹配的结果

finditer

finditer(string, pos=0, endpos=-1)

通过该迭代器我们可以访问匹配的每一个字符串

split

slit(strng, maxsplit=0)

方法表示将能够匹配的子串切割

sub

sub(repl, string, count=0)

方法用来替换

subn

subn(repl, string, count=0)

方法也是用于替换,返回一个元组

1.match方法讲解

该方法用于查找字符串的头部,它只要找到了一个匹配的结果就返回,说明:string是待匹配的字符串,pos和endpos指定字符串的起点和终点的位置,当不指定时,默认从头部开始匹配,当匹配成功时,返回Match对象。

import re

"""
match(string, pos=0, endpos=-1)
该方法用于查找字符串的头部,它只要找到了一个匹配的结果就返回
说明:string是待匹配的字符串,pos和endpos指定字符串的起点和终点的位置
当不指定时,默认从头部开始匹配,当匹配成功时,返回Match对象
"""
test_str = "aaaa12345678sfsdf"
pattern = re.compile(r"\d+")
matcher = pattern.match(test_str, 4, 12)
print(matcher)  # <re.Match object; span=(4, 12), match='12345678'>
print(matcher.group())  # 12345678, 返回匹配的字符串,可以使用group()或者group(0)
print(matcher.start())  # 4, 返回匹配的字符串在整个字符串的起始位置
print(matcher.end())    # 12, 返回匹配的字符串在整个字符串的结束位置
print(matcher.span())   # (4, 12), 返回(star(), end())

2.search方法讲解

该方法用于查找字符串的任何位置,它只要找到一个匹配的结果就返回,
说明:string是带匹配的字符串,pos和endpos分别为字符串的起始和结束位置,
当匹配成功时返回Match对象,匹配不成功时返回None。

import re

"""
search(string, pos=0, endpos=-1)
该方法用于查找字符串的任何位置,它只要找到一个匹配的结果就返回
说明:string是带匹配的字符串,pos和endpos分别为字符串的起始和结束位置
当匹配成功时返回Match对象,匹配不成功时返回None
"""
# egg_001:匹配到第一个就返回
test_str = "aaa777bbb888ccc999"
pattern = re.compile(r"\d+")
matcher = pattern.search(test_str)
print(matcher)  # <re.Match object; span=(3, 6), match='777'>

# egg_002:指定起始位置
test_str = "aaa000bbb111ccc222"
pattern = re.compile(r"\d+")
matcher = pattern.search(test_str, 3, 12)
print(matcher)  # <re.Match object; span=(3, 6), match='000'>
print(matcher.group())  # 000, 返回匹配的字符串,可以使用group()或者group(0)
print(matcher.start())  # 3, 返回匹配的字符串在整个字符串的起始位置
print(matcher.end())    # 6, 返回匹配的字符串在整个字符串的结束位置
print(matcher.span())   # (3, 6), 返回(star(), end())

3.findall方法讲解

该方法返回所有匹配的结果,
说明:string是带匹配的字符串,pos和endpos分别为字符串的起始和结束位置,
当匹配成功时返回匹配的列表,匹配不成功时返回空列表,
捕获:findall函数,在正则匹配里,如果有分组,就仅仅匹配分组里面的内容,
然后返回这个组的列表,如果有多个分组,那就把每一个分组看成一个单位,
组合成一个元组,然后返回一个含有多个元组的列表。

import re

"""
findall(string, pos=0, endpos=-1)
该方法返回所有匹配的结果
说明:string是带匹配的字符串,pos和endpos分别为字符串的起始和结束位置,
当匹配成功时返回匹配的列表,匹配不成功时返回空列表,
捕获:findall函数,在正则匹配里,如果有分组,就仅仅匹配分组里面的内容,
然后返回这个组的列表,如果有多个分组,那就把每一个分组看成一个单位,
组合成一个元组,然后返回一个含有多个元组的列表。
"""
# egg_001:匹配所有位置并返回结果
test_str = "aaa111bbb222ccc333"
pattern = re.compile(r"\d+")
matcher = pattern.findall(test_str)
print(matcher)  # ['111', '222', '333']

# egg_002:设置起始位置, 返回特定范围内的结果
test_str = "aaa111bbb222ccc333"
pattern = re.compile(r"\d+")
matcher = pattern.findall(test_str, 2, 13)
print(matcher)  # ['111', '222']

4.finditer方法讲解

说明:string是带匹配的字符串,pos和endpos分别为字符串的起始和结束位置,
说明:该方法返回所有匹配的字符串,但是它返回的是一个迭代器,
通过该迭代器我们可以访问匹配的每一个字符串。

import re

"""
finditer(string, pos=0, endpos=-1)
说明:string是带匹配的字符串,pos和endpos分别为字符串的起始和结束位置,
说明:该方法返回所有匹配的字符串,但是它返回的是一个迭代器
通过该迭代器我们可以访问匹配的每一个字符串
"""
# egg_001:匹配所有符合要求的并返回一个迭代器
test_str = "aaa111bbb222ccc333"
pattern = re.compile(r"\d+")
matcher = pattern.finditer(test_str)
print(matcher)  # <callable_iterator object at 0x000001D9CB8FE8C8>
for result in matcher:
    print("找到的字符串{0},位置是{1}".format(result.group(), result.span()))
    # 找到的字符串111,位置是(3, 6)
    # 找到的字符串222,位置是(9, 12)
    # 找到的字符串333,位置是(15, 18)

# egg_002:设置匹配起始位置,返回范围内匹配结果
test_str = "aaa111bbb222ccc333"
pattern = re.compile(r"\d+")
matcher = pattern.finditer(test_str, 3, 12)
print(matcher)  # <callable_iterator object at 0x0000026403301D88>
for result in matcher:
    print("找到的字符串{0},位置是{1}".format(result.group(), result.span()))
    # 找到的字符串111,位置是(3, 6)
    # 找到的字符串222,位置是(9, 12)

5.split方法讲解

该方法表示将能够匹配的子串切割,说明:string表示需要匹配的字符串,
maxsplit表示最大的分割次数,不指定即为全部分割。

import re

"""
slit(strng, maxsplit=0)
说明:该方法表示将能够匹配的子串切割,string表示需要匹配的字符串,
maxsplit表示最大的分割次数,不指定即为全部分割
"""
# egg_001: 返回切割后的结果
test_str = "aaaa bbbb  cccc,dddd;eeee"
pattern = re.compile(r"[,;\s]+")
matcher = pattern.split(test_str)
print(matcher)  # ['aaaa', 'bbbb', '', 'cccc', 'dddd', 'eeee']

# egg_002:设置切割次数,返回切割后的结果
test_str = "aaaa bbbb  cccc,dddd;eeee"
pattern = re.compile(r"[,;\s]+")
matcher = pattern.split(test_str, 2)
print(matcher)  # ['aaaa', 'bbbb', 'cccc,dddd;eeee']

6.sub方法讲解

该方法用来替换,
说明:repl如果为字符串,会使用repl替换字符串中的每一个匹配的子串,并且返回替换后的字符串,
如果为函数,则该函数应该只接收一个Match对象,并且返回一个字符串用于替换,
count用于指定替换次数。

import re

"""
sub(repl, string, count=0)
该方法用来替换
说明:repl如果为字符串,会使用repl替换字符串中的每一个匹配的子串,并且返回替换后的字符串,
如果为函数,则该函数应该只接收一个Match对象,并且返回一个字符串用于替换,
count用于指定替换次数。
"""
# egg_001: repl为字符串
test_str = "aaaa bbbb  cccc,dddd;eeee"
pattern = re.compile(r"[,;\s]+")
repl_str = "&"
matcher = pattern.sub( repl_str, test_str)
print(matcher)  # aaaa&bbbb&cccc&dddd&eeee

# egg_002: repl为函数,设置次数为3
test_str = "aaaa bbbb  cccc,dddd;eeee"
pattern = re.compile(r"[,;\s]+")

def func(m):
    print("m:", m)
    return "*"

matcher = pattern.sub(func, test_str, 3)
print(matcher)  # aaaa*bbbb*cccc*dddd;eeee

7.subn方法讲解

该方法也是用于替换,说明:返回一个元组,元组有两个元素,
第一个和使用sub方法返回的结果一致,另一个表示替换的次数。

import re

"""
subn(repl, string, count=0)
说明:该方法也是用于替换,返回一个元组,元组有两个元素,
第一个和使用sub方法返回的结果一致,另一个表示替换的次数。
"""
# egg_001: repl为字符串
test_str = "aaaa bbbb  cccc,dddd;eeee"
pattern = re.compile(r"[,;\s]+")
repl_str = "&"
matcher = pattern.subn(repl_str, test_str)
print(matcher)  # ('aaaa&bbbb&cccc&dddd&eeee', 4)

# egg_002: repl为函数,设置次数为3
test_str = "aaaa bbbb  cccc,dddd;eeee"
pattern = re.compile(r"[,;\s]+")

def func(m):
    print("m:", m)
    return "*"

matcher = pattern.subn(func, test_str, 3)
print(matcher)  # ('aaaa*bbbb*cccc*dddd;eeee', 3)

以上是python关于正则表达式的讲解之二,后续会继续更新正则表达式的经典使用案例,有疑问的欢迎评论或私信博主啊。