本文讲解正则表达式常用的几大函数方法:
方法 | 使用格式 | 讲解 |
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关于正则表达式的讲解之二,后续会继续更新正则表达式的经典使用案例,有疑问的欢迎评论或私信博主啊。