Python中re模块正则表达式详解

举报
Python新视野 发表于 2021/09/09 23:28:06 2021/09/09
【摘要】 Python中re模块正则表达式详解 re.match()函数re.search()函数re.sub()函数re.compile()函数re.findall()函数re.finditer()函数 ...

re.match()函数

re.match会从字符串的起始位置按模式匹配,如果匹配不成功,或是不是在起始位置匹配成功,就会返回None。匹配成功时返回一个匹配的对象,我们可以使用匹配对象函数来获取匹配表达式。

re.match(pattern, string, flags=0)

  • pattern:匹配的正则表达式
  • string:要匹配的字符串
  • flags:标志位,用于控制正则表达式的匹配方式,如是否区分大小写、是否多行匹配等。

re.I匹配时忽略字符串中的大小写。

import re

print(re.match('aa','Aaaabc',flags=re.I))    # 起始位置匹配
print(re.match('aa','bbaabc',flags=re.I))    # 不再起始位置匹配
# span()返回一个元组包含匹配开始和结束的位置
print(re.match('aa','Aaaabc',flags=re.I).span())

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

在这里插入图片描述
使用group(num)groups()匹配对象函数来获取匹配表达式。

  • group(num=0):根据输入的组号(多个组号),返回一个字符串(元组),元组中包含组号的对应值。默认为0,即返回match匹配到的所有内容。
  • groups():返回一个包含所有小组字符串的元组,从 1 到 所含的小组号。
line = "Cats are smarter than dogs"
matchObj = re.match(r'(.*) smarter (.*?) (.*)', line)

if matchObj:
    print("matchObj.group() : ", matchObj.group())
    print("matchObj.group(1) : ", matchObj.group(1))
    print("matchObj.group(0, 1, 2, 3) : ", matchObj.group(0, 1, 2, 3))
    print("matchObj.groups() : ", matchObj.groups())
else:
    print("No match!!")
print(matchObj)

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

在这里插入图片描述


re.search()函数

re.search ()在整个字符串匹配并返回第一个成功的匹配。

re.search(pattern, string, flags=0)

print(re.search('aa','aaaabc').span())   # 在起始位置匹配
print(re.search('aa','bbaaac').span())    # 不在起始位置匹配
# NoneType对象没有span()
print(re.search('aa','bbaccc'))    # 匹配失败

运行结果:
(0, 2)
(2, 4)
None

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

matchsearch的不同之处很好理解,match是只匹配开头的字符串,如果匹配失败,后面的将不再匹配,直接返回None。而search是在整个字符串中匹配,如果起始位置没有匹配到,那么它会继续匹配剩余的字符串,直到第一次匹配成功,如果字符串结束都没有匹配成功,那么返回None


re.sub()函数

re.sub()函数可以将字符串中满足匹配条件的内容全部替换。

re.search(pattern, repl, string, count, flags=0)

  • repl:替换的字符串,可以是一个函数。
  • count:匹配成功后替换的最大次数,默认为0,表示替换所有的匹配。
line = '女朋友是女神'
print(re.sub(r'(?<=是).*', '仙女', line))

运行结果:
女朋友是仙女

  
 
  • 1
  • 2
  • 3
  • 4
  • 5

配合lambda使用

line = 'A2B2C3'
print(re.sub(r'(\d+)', lambda x: str(int(x.group())*2), line))

运行结果:
A4B4C6

  
 
  • 1
  • 2
  • 3
  • 4
  • 5

re.compile()函数

re.compile()用于编译正则表达式,生成一个正则表达式(Pattern)对象。

re.compile(pattern[, flags])

  • pattern:一个字符串形式的正则表达式。
pattern = re.compile(r'\d+')
print(pattern.match('one12twothree34four'))
print(pattern.match('one12twothree34four', 3, 10))

运行结果:
None
(3, 5)

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

re.findall()函数

re.findall()用于在字符串中找到正则表达式所匹配的所有子串,并返回一个列表,如果没有找到匹配的,则返回空列表。

re.findall(string[, pos[, endpos]])

  • string:待匹配的字符串。
  • pos:可选参数,指定字符串的起始位置,默认为0。
  • endpos:可选参数,指定字符串的结束位置,默认为字符串的长度。
pattern = re.compile(r'\d+')
print(pattern.findall('A1B2C3'))
print(pattern.findall('A1B2C3', 0, 4))

运行结果:
['1', '2', '3']
['1', '2']

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

re.finditer()函数

re.finditer()在字符串中找到正则表达式所匹配的所有子串,并把它们作为一个迭代器返回。

re.finditer(pattern, string, flags=0)

result = re.finditer(r"\d+", "A1B2C3")
for match in result:
    print(match.group())

运行结果:
1
2
3

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

知识参考: 菜鸟教程

文章来源: blog.csdn.net,作者:Dream丶Killer,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/qq_43965708/article/details/113061983

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。